Wirtualna przestrzeń adresowa procesu


W systemie linux każdy proces widzi swoją pamięć jako jednolity obszar, nie mając dostępu do pamięci innych procesów. Takie rozwiązanie jest możliwe dzięki mechanizmowi adresowania pośredniego i zastosowaniu specjalnych struktur danych.

Przestrzeń adresowa każdego procesu wygląda mniej więcej tak:


Uproszczony schemat przestrzeni adresowej procesu

Schemat ten nie zawiera takich rzeczy jak nazwa, parametry wywołania programu, zmienne środowiskowe i segmety pamięci dzielonej. Jak widać, potencjalnie proces może używać nawet 3GB pamięci operacyjnej (ostatni GB jest dla niego niedostępny). W rzeczywistości powstrzyma go od tego limit pamięci dla użytkownika.

Wszystkie informacje o danym procesie znajdują się w strukturze task_struct, którą nie będziemy się tutaj zajmować. Interesuje nas jedynie pole mm tej struktury, wskazujące na strukturę mm_struct, zawierającą wszystkie informacje o pamięci danego procesu. Wewnątrz tej struktury przyjrzymy się jak został zaimplementowany podział przestrzeni na obszary.

Ważne struktury danych:


Są one powiązane w następujący sposob:


Schemat powiazań struktur pamięci adresowej procesu

Warto obejrzeć również flagi obszarów, i pamiętać o istnieniu stałych (include/linux/sched.h):
MAX_MAP_COUNT - Maksymalna liczba obszarów pamięci dla procesu (=65536)
AVL_MIN_MAP_COUNT - Liczba obszarów, przy ktorej jest uruchamiane drzewo AVL (=32)


Bibliografia:
include/linux/sched.h
include/linux/mm.h
mm/mmap.c
mm/mmap_avl.c