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ć?

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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.