Po pierwsze, 32-bitowy system ma 0xffffffff
( 4'294'967'295
) adresy liniowe, aby uzyskać dostęp do fizycznej lokalizacji na szczycie pamięci RAM.
Jądro dzieli te adresy na przestrzeń użytkownika i jądra.
Dostęp do przestrzeni użytkownika (wysoka pamięć) może uzyskać użytkownik, aw razie potrzeby także jądro.
Zakres adresów w zapisie szesnastkowym i dziesiętnym:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
Dostęp do przestrzeni jądra (mało pamięci) jest możliwy tylko przez jądro.
Zakres adresów w zapisie szesnastkowym i dziesiętnym:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Lubię to:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Tak więc układ pamięci, który widziałeś, dmesg
odpowiada odwzorowaniu adresów liniowych w przestrzeni jądra.
Najpierw sekwencje .text, .data i .init, które zapewniają inicjalizację własnych tablic stron jądra (tłumaczą adresy liniowe na adresy fizyczne).
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
Zakres, w którym znajduje się kod jądra.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
Zakres, w którym znajdują się segmenty danych jądra.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
Zakres, w którym znajdują się początkowe tabele stron jądra.
(i kolejne 128 kB dla niektórych dynamicznych struktur danych).
Ta minimalna przestrzeń adresowa jest wystarczająco duża, aby zainstalować jądro w pamięci RAM i zainicjować podstawowe struktury danych.
Ich użyty rozmiar jest pokazany w nawiasach, na przykład kod jądra:
0xc071ae6a - 0xc0400000 = 31AE6A
W notacji dziesiętnej to 3'255'914
(3179 kB).
Po drugie, wykorzystanie przestrzeni jądra po inicjalizacji
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
Niski zakres może być wykorzystywany przez jądro do bezpośredniego dostępu do adresów fizycznych.
To nie jest pełny 1 GB, ponieważ jądro zawsze wymaga co najmniej 128 MB adresów liniowych do implementacji nieciągłej alokacji pamięci i adresów liniowych zamapowanych na stałe.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
Przydział pamięci wirtualnej może przydzielać ramki stron w oparciu o nieciągły schemat. Główną zaletą tego schematu jest unikanie fragmentacji zewnętrznej, która jest wykorzystywana do obszarów wymiany, modułów jądra lub alokacji buforów do niektórych urządzeń I / O.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Trwałe mapowanie jądra pozwala jądru na ustanowienie długotrwałych mapowań ramek stron o wysokiej pamięci w przestrzeni adresowej jądra. Kiedy strona HIGHMEM jest mapowana za pomocą kmap (), stąd przypisywane są adresy wirtualne.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Są to adresy liniowe z odwzorowaniem poprawek, które mogą odnosić się do dowolnego adresu fizycznego w pamięci RAM, a nie tylko do 1 GB, jak np. Adresy lowmem. Naprawione adresy liniowe są nieco bardziej wydajne niż ich koledzy z lowmem i pkmap. Istnieją dedykowane deskryptory tablic stron przypisane do ustalonego mapowania, stąd przypisywane są mapowania stron HIGHMEM przy użyciu kmap_atomic.
Jeśli chcesz zanurzyć się głębiej w króliczą nory:
Zrozumienie jądra Linux