Przydzielanie przestrzeni adresowej procesowi

Przydział przestrzeni adresowej dla procesu odbywa się w trakcie jego tworzenia fork'iem13. Fork wywołuje w tym celu funkcję copy_mm, która przydziela nowemu procesowi osobną tablicę stron i ustawia struktury opisujące pamięć nowego procesu.

Sposób przydziału przestrzeni adresowej zależy od tego, czy nowo tworzony proces ma ustawioną flagę CLONE_VM14. Gdy CLONE_VM jest ustawiona to tworzony proces staje się współużytkownikiem przestrzeni adresowej rodzica. To znaczy wskaźnik mm, w task_struct nowego procesu, ustawiany jest na strukturę mm_struct rodzica, a licznik użytkowników pamięci rodzica jest zwiększany o jeden. Na tym kończy się przydział przestrzeni w tym przypadku.

Gdy CLONE_VM nie jest ustawiona to copy_mm robi co następuje:

--
przydziela pamięć na nową strukturę mm_struct;
--
kopiuje do niej zawartość mm_struct rodzica;
--
robi dup_mmap(mm);
--
dołącza nowy mm_struct do globalnej listy tych struktur;
--
ustawia nowy LDT dla tworzonego procesu.

Z kolei funkcja dup_mmap działa tak:

--
inicjalizuje pola struktury mm_struct, związane z obsługą obszarów VMA.
--
przegląda listę obszarów VMA rodzica i dla każdego z nich sprawdza czy ma on ustawioną flagę VM_DONTCOPY, jeśli tak to przechodzi do następnego obszaru, a jeśli nie to tworzy nowy deskryptor VMA, zwiększając przy tym licznik map_countmm_struct. Do nowego deskryptora kopiuje zawartość oglądanego deskryptora rodzica i ustawia blokadę na VMA opisywanym przez te deskryptory. Na koniec tworzy Tablice Stron potrzebne nowemu procesowi do odwzorowywania stron wchodzących w skład oglądanego VMA.
--
gdy map_count przekroczy stałą AVL_MIN_MAP_COUNT, to jest budowane drzewo AVL z bloków VMA.

Zatem, przydział przestrzeni adresowej, polega wyłącznie na utworzeniu struktur danych dla nowego procesu. Struktury te są tworzone na podstawie istniejących struktur rodzica i mają prawie identyczną zawartość. W szczególności, nowopowstały proces ma przydzielone wszystkie nie prywatne strony rodzica. Strony te są współdzielone przez oba procesy tak długo, jak długo oba używają ich tylko do czytania. Gdy jeden z nich zechce pisać po jakiejś stronie, wtedy jest ona fizycznie powielana, i od tej pory procesy mają swoje własne kopie tej strony. Strategia ta nazywa się kopiowaniem przy zapisie (ang. COW - copy on write) i ma na celu zwiększenie efektywności systemu. Zatem po jakimś czasie oba procesy będą miały różne zestawy stron.

Jak widać, proces wciąż nie ma zainicjalizowanych żadnych segmentów. Ustawianie segmentów odbywa się dopiero przy ładowaniu pliku wykonywalnego do tak przygotowanego procesu.


Tomasz Szymko 27 listopada 2001