1. Kilka słów wprowadzenia




Pojęcie Przestrzeni Adresowej Procesu oznacza lokalny z punktu widzenia każdego procesu zbiór adresów, do których może się on odwoływać zapisując lub odczytując swoje dane, odkładając/pobierając coś ze swojego stosu, korzystając z urządzeń, czy otwierając lub zamykając zwykłe pliki. Jak widzieliśmy w opracowaniu o adresowaniu, adres liniowy w kontekście jednego procesu nie ma nic wspólnego z pozornie "takim samym" adresem w kontekście innego.

Zasadnicze różnice w obsłudze pamięci jądra i procesów użytkownika wynikają z dwóch rzeczy:

  1. Po pierwsze, w przypadku jądra nie jest potrzebne kontrolowanie poprawności odwołań do pamięci. Po prostu przyjmuje się, że są one poprawne, co jest o tyle racjonalnym założeniem, że po pierwsze zazwyczaj faktycznie są one poprawne :-), a po drugie w przypadku stwierdzenia niepoprawności jakiegoś odwołania spowodowanego bugiem, trudno byłoby przedsięwziąc jakieś bardziej sensowne kroki.
  2. Po drugie, w celu zwiększenia efektywności systemu, w przypadku żądań alokacji pamięci ze strony procesu użytkownika stosowana jest technika opóźniania ich realizacji. Prowadzi to do efektywniejszego wykorzystania pamięci, gdyż praktyka wykazuje, że np. żądanie przez proces kawałka pamięci dynamicznej niekoniecznie oznacza, że będzie on chciał natychmiast z niej całej korzystać. Wiąże się to z technikami znanymi pod nazwą stronicowania na żądanie i kopiowania przy zapisie.

W dalszej części tego opracowania poznamy zatem sposób, w jaki realizowane są postulaty Przestrzeni Adresowej Procesu w jądrze Linuxa w wersji 2.4.