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:
-
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.
-
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.