pamięć wirtualna procesu a przerwanie page fault

0

Witam
Przeczytałem sporo artykułów,omówień na temat pamięci wirtualnej procesu w linuxie. Z mojej strony jedyną możliwość którą widzę że zgłosi się przerwanie page fault (tzn. że w tablicy stron procesu jednostkta MMU procesora nie znajdzie dla adresu pamięci wirtualnej X adresu pamięci fizycznej) jest sytuacja w której robimy Mmap jakiegoś pliku w kodzie naszego programu. W takim przypadku dopiero przy odczycie

    char* memf = (char*)mmap(NULL, 20, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0);
    if (fd == -1)
    {
        perror("mmap failed");
        exit(EXIT_FAILURE);
    }

    cout << memf[0] << endl;

zostanie zarezerwowana 1 ramka fizyczna dla strony w której znajduje się memf[0] i tam zostanie przetransferowana dana z pliku.
Jeszcze jak zrobimy mmap dla MAP_PRIVATE | MAP_ANONYMOUS (tzn. mapowanie anonimowe niereprezentowane na żaden plik) to tutaj w tym wypadku też zostanie zarezerwowany początkowo obszar tylko pamięci wirtualnej i dopiero przy odwoływaniu się jak wyżej będzie rezerwacja ramek fizycznych. Podejrzewam że podobna sytuacja jest z rezerwacją pamięci na stercie, jak wywołasz new/malloc to zarezerwuje Ci się tylko pamięci wirtualna na stercie i dopiero przy użyciu będą rezerwowały Ci się ramki fizyczne.
Czyli innymi słowy jeżeli Twój program nie robi tego co wyżej, tylko masz zmienne lokalne które są na stosie oraz statyczne które są w Data/BSS segmencie jak i sam kod programu będący w text segmencie to w takim przypadku nigdy dla tego procesu nie będzie przerwania page fault bo już od razu na wstępie wszystkie strony procesu w tablicy są wypełnione ramkami, czy mam rację? Może nie mam, bo np. może jeszcze być taka sytuacja że na potrzeby innego procesu system operacyjny postanowi znieść ramkę fizyczną mojego programu do obszaru pamięci wymiany. A ta ramka fizyczna może być i taka co trzyma dane ze stosu/text segmentu.

0

Segmenty programu też nie są kopiowane do pamięci przy uruchamianiu tylko mapowane z pliku, więc uruchomienie programu również będzie związane z page faultami. Albo jak proces jest uruchomiony za pomocą fork, to współdzieli z procesem macierzystym pamięć w trybie COW i jeśli któryś z programów ją zmodyfikuje to następuje page fault i wtedy dopiero system robi kopię danej strony. Albo jak dane strony zostaną przeniesione do swapa, albo po prostu zrzucone (jeśli są zmapowane do pliku i nie zostały zmodyfikowane, to można je zawsze potem wczytać z tego pliku jeszcze raz, nie trzeba zapisywać do swapa ;) )
Jak widać jest wiele możliwości :)

0
mad_penguin napisał(a):

Segmenty programu też nie są kopiowane do pamięci przy uruchamianiu tylko mapowane z pliku

Nawet ten segment na dole (text segment), który zawiera assemblerowe instrukcje nie jest od razu cały w pamięci RAM?

0

Tak, nie jest od razu :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1