Co oznacza układ pamięci wirtualnego jądra w dmesg?

19

Podczas przeglądania „Wyjścia dmesg” mogłem zobaczyć listę wartości, których nie jestem w stanie właściwie zrozumieć.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
    pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
    vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
    lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
      .init : 0xc0906000 - 0xc0973000   ( 436 kB)
      .data : 0xc071ae6a - 0xc08feb78   (1935 kB)
      .text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Z wartości rozumiem, że mam 2 GB pamięci RAM (pamięć fizyczna). Ale reszta rzeczy wydaje mi się być Magicznymi Liczbami.

Chciałbym wiedzieć o każdym z nich (fixmap, pkmap, itp.) W skrócie (jeśli więcej wątpliwości, opublikuję każdy jako osobne pytanie)?

Czy ktoś mógłby mi to wyjaśnić?

Sen
źródło

Odpowiedzi:

22

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ś, dmesgodpowiada 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

machać
źródło
Dzięki za tę świetną odpowiedź. Chciałbym wiedzieć, dlaczego niski poziom pamięci nie jest pełny 1 GB, a więcej o następnej części zdania „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”.
Sen
Jądro musi od czasu do czasu uzyskiwać dostęp do kodu wysokiej pamięci (np. Informacje o BIOSie i ACPI znajdują się na pierwszym MB pamięci RAM), nie może tego robić bezpośrednio (podobnie jak obszar lowmem), dlatego musi mapować małą pamięć na w przypadku adresów liniowych o wysokiej pamięci 128 MB jest zarezerwowane tylko do tego celu. Obszar vmalloc jest w większości tymczasowo mapowany na obszary o wysokiej pamięci i dość szybko odwzorowuje się.
wag
Więc strony ustawione przez jądro dla wirtualnego wywołania systemowego są również częścią fixmap ??? Natknąłem się na to pytanie, ponieważ chcę wiedzieć, co dokładnie leży na stronie o adresach fffb5000, fffa1000 itd. ... Mam problemy z odtwarzaniem rekordów maszyny wirtualnej, ponieważ wiele procesorów wirtualnych ma dostęp do tej strony DUŻO .... jak to zrobić Wiem, co dokładnie jest pod tym adresem ...
Nawiasem mówiąc,