GNU/Linux >> Znalost Linux >  >> Linux

Linux – Co znamená rozložení paměti virtuálního jádra v Dmesg?

Při procházení „Výstup dmesg“ Viděl jsem seznam hodnot, kterým nejsem schopen správně porozumět.

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 hodnot jsem pochopil, že mám 2GB RAM (fyzická paměť). Ale zbytek věcí se mi zdá být magickými čísly.

Rád bych o každém z nich (fixmap, pkmap,.. atd.) stručně věděl (v případě více pochybností zveřejním každý jako samostatnou otázku)?

Mohl by mi to někdo vysvětlit?

Přijatá odpověď:

Za prvé, 32bitový systém má 0xffffffff (4'294'967'295 ) lineární adresy pro přístup k fyzickému umístění v paměti RAM.
Jádro rozděluje tyto adresy na uživatelský a kernelový prostor.

Uživatelský prostor (vysoká paměť) může být přístupný uživateli a v případě potřeby také jádrem.
Rozsah adres v hexadecimálním a decovém zápisu:

0x00000000 - 0xbfffffff
0 - 3'221'225'471

K prostoru jádra (nízká paměť) má přístup pouze jádro.
Rozsah adres v hexadecimálním a decovém zápisu:

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

Takhle:

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

Tedy rozložení paměti, které jste viděli v dmesg odpovídá mapování lineárních adres v prostoru jádra.

Za prvé, sekvence .text, .data a .init, které poskytují inicializaci vlastních tabulek stránek jádra (lineární převod na fyzické adresy).

.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

Rozsah, kde se nachází kód jádra.

.data : 0xc071ae6a - 0xc08feb78   (1935 kB)

Rozsah, kde se nacházejí datové segmenty jádra.

.init : 0xc0906000 - 0xc0973000   ( 436 kB)

Rozsah, kde jsou umístěny počáteční tabulky stránek jádra.

(a dalších 128 kB pro některé dynamické datové struktury.)

Tento minimální adresní prostor je dostatečně velký na to, aby mohl nainstalovat jádro do paměti RAM a inicializovat jeho základní datové struktury.

Jejich použitá velikost je uvedena v závorce, vezměte si například kód jádra:

0xc071ae6a - 0xc0400000 = 31AE6A

V desítkovém zápisu je to 3'255'914 (3179 kB).

Za druhé, využití prostoru jádra po inicializaci

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

Rozsah lowmem může jádro použít k přímému přístupu k fyzickým adresám.
Toto není celý 1 GB, protože jádro vždy vyžaduje alespoň 128 MB lineárních adres pro implementaci nesouvislého přidělování paměti a fixně mapovaných lineárních adres .

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

Přidělení virtuální paměti může alokovat rámce stránky na základě nesouvislého schématu. Hlavní výhodou tohoto schématu je vyhnout se externí fragmentaci, to se používá pro swapovací oblasti, moduly jádra nebo přidělování vyrovnávacích pamětí některým I/O zařízením.

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

Trvalé mapování jádra umožňuje jádru vytvořit dlouhotrvající mapování rámců stránek s velkou pamětí do adresového prostoru jádra. Když je stránka HIGHMEM mapována pomocí kmap(), virtuální adresy jsou přidělovány odtud.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Jedná se o fixně mapované lineární adresy, které mohou odkazovat na jakoukoli fyzickou adresu v paměti RAM, nejen na poslední 1 GB, jako jsou adresy s nízkou pamětí. Fixně mapované lineární adresy jsou o něco efektivnější než jejich kolegové lowmem a pkmap.
Pro fixní mapování jsou přiřazeny vyhrazené deskriptory tabulek stránek a odtud jsou přidělována mapování stránek HIGHMEM pomocí kmap_atomic.

Související:Jak odstranit všechny soubory s konkrétní příponou v konkrétní složce?

Pokud se chcete ponořit hlouběji do králičí nory:
Porozumění linuxovému jádru


Linux
  1. Linux – jaké zdroje entropie používá jádro Linuxu?

  2. Co dělá oldconfig přesně v makefile linuxového jádra?

  3. Co to znamená, když se řekne linuxové jádro je preemptivní?

  1. Co znamená symbol linux pipe | dělat?

  2. Kolik RAM používá jádro?

  3. jaké zabijáky procesů má linux?

  1. Linuxové jádro:5 nejlepších inovací

  2. Co znamená __init v kódu jádra Linuxu?

  3. K čemu je mít část jádra ve virtuálním paměťovém prostoru linuxových procesů?