next up previous
Next: Tablice stron procesu Up: Przestrzeń adresowa Previous: Wykorzystanie ramek

Tablice stron jądra

Jądro posiada własny globalny katalog stron zawarty w zmiennej swapper_pg_dir.

Odwzorowuje on pamięć w następujący sposób:

PAGE_OFFSET jest makrem określającym adres liniowy pierwszego bajta pamięci fizycznej (dla Intela 3G), oznacza ono również początek przestrzeni adresowej jądra.

Następne adresy odwzorowyzane są zgodnie z równaniem: adres liniowy = adres fizyczny + PAGE_OFFSET

Adres liniowy odpowiadający końcowi pamięci fizycznej jest przechowywany w zmiennej high_memory.

Taka organizacja tablic stron jądra ogranicza wielkość pamięci fizycznej, z której Linux może korzystać do maksymalny adres liniowy - PAGE_OFFEST.

Zaletą tego podejścia jest możliwość łatwego tłumaczenia adresów w przestrzeni adresowej jądra:

Makro __pa(x) zwraca adres fizyczny odpowiadający adresowi liniowemu zawartemu w x. PAGE_OFFSET$\leq$x$\leq$high_memory.

Makro __va(x) zwraca adres liniowy odpowiadający adresowi fizycznemu zawartemu w x.

Pozycje poniżej PAGE_OFFSET pozostają niewykorzystane.

Zwykle, kiedy jądro potrzebuje blok pamięci, szuka spójnego w sensie adresowania fizycznego bloku odpowiedniej długości (szczegóły przy opisie get_free_pages). Znaleziony blok jądro oznacza jako wykorzystany, nie dokonuje natomiast żadnych zmian w jego adresowaniu. Blok ten pozostaje spójny w adresowaniu wirtualnym z uwagi na opisaną powyżej konstrukcję tablic stron.

Adresy powyżej high_memory są wykorzystywane przez jądro do łączenia nieciągłych bloków pamięci fizycznej w ciągłe bloki pamięci wirtualnej (funkcja vmalloc).


next up previous
Next: Tablice stron procesu Up: Przestrzeń adresowa Previous: Wykorzystanie ramek
Wojciech Jaworski 2001-12-16