GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Was bedeutet das virtuelle Kernel-Speicherlayout in Dmesg?

Beim Durchlaufen der „Ausgabe von dmesg“ Ich konnte eine Liste mit Werten sehen, die ich nicht richtig verstehe.

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)

Aus den Werten geht hervor, dass ich 2 GB RAM (physischer Speicher) habe. Aber der Rest scheint für mich Magic Numbers zu sein.

Ich würde gerne kurz etwas über jedes (Fixmap, Pkmap usw.) wissen (wenn mehr Zweifel bestehen, werde ich jedes als separate Frage posten)?

Kann mir das jemand erklären?

Akzeptierte Antwort:

Zunächst einmal hat ein 32-Bit-System 0xffffffff (4'294'967'295 ) lineare Adressen, um auf einen physischen Speicherort auf dem RAM zuzugreifen.
Der Kernel teilt diese Adressen in Benutzer- und Kernelbereich.

Auf den User Space (High Memory) kann der User und ggf. auch der Kernel zugreifen.
Der Adressbereich in hexadezimaler und dezimaler Schreibweise:

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

Auf den Kernel Space (Low Memory) kann nur der Kernel zugreifen.
Der Adressbereich in Hex- und Dez-Notation:

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

So:

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

Also das Speicherlayout, das Sie in dmesg gesehen haben entspricht der Abbildung linearer Adressen im Kernelspace.

Erstens die .text-, .data- und .init-Sequenzen, die für die Initialisierung der Kernel-eigenen Seitentabellen sorgen (linear in physikalische Adressen übersetzen).

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

Der Bereich, in dem sich der Kernel-Code befindet.

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

Der Bereich, in dem sich die Kernel-Datensegmente befinden.

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

Der Bereich, in dem sich die anfänglichen Seitentabellen des Kernels befinden.

(und weitere 128 kB für einige dynamische Datenstrukturen.)

Dieser minimale Adressraum ist gerade groß genug, um den Kernel im RAM zu installieren und seine Kerndatenstrukturen zu initialisieren.

Ihre verwendete Größe wird in Klammern angezeigt, nehmen Sie zum Beispiel den Kernel-Code:

0xc071ae6a - 0xc0400000 = 31AE6A

In Dezimalschreibweise ist das 3'255'914 (3179 kB).

Zweitens die Nutzung des Kernelspeicherplatzes nach der Initialisierung

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

Der Lowmem-Bereich kann vom Kernel verwendet werden, um direkt auf physische Adressen zuzugreifen.
Dies sind nicht die vollen 1 GB, da der Kernel immer mindestens 128 MB an linearen Adressen benötigt, um eine nicht zusammenhängende Speicherzuweisung und fest zugeordnete lineare Adressen zu implementieren .

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

Die Zuordnung des virtuellen Speichers kann Seitenrahmen basierend auf einem nicht zusammenhängenden Schema zuweisen. Der Hauptvorteil dieses Schemas besteht darin, externe Fragmentierung zu vermeiden, dies wird für Auslagerungsbereiche, Kernelmodule oder die Zuweisung von Puffern zu einigen I/O-Geräten verwendet.

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

Die permanente Kernel-Zuordnung ermöglicht es dem Kernel, dauerhafte Zuordnungen von Seitenrahmen mit hohem Speicher in den Kernel-Adressraum einzurichten. Wenn eine HIGHMEM-Seite mit kmap() gemappt wird, werden von hier aus virtuelle Adressen zugewiesen.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Dies sind fest zugeordnete lineare Adressen, die sich auf jede physikalische Adresse im RAM beziehen können, nicht nur auf die letzten 1 GB wie die Lowmem-Adressen. Fest zugeordnete lineare Adressen sind etwas effizienter als ihre lowmem- und pkmap-Kollegen.
Es gibt dedizierte Seitentabellen-Deskriptoren, die für die feste Zuordnung zugewiesen sind, und Zuordnungen von HIGHMEM-Seiten, die kmap_atomic verwenden, werden von hier aus zugewiesen.

Verwandte:Wie lösche ich alle Dateien mit einer bestimmten Erweiterung in einem bestimmten Ordner?

Wenn Sie tiefer in den Kaninchenbau eintauchen möchten:
Den Linux-Kernel verstehen


Linux
  1. Der Linux-Kernel:Top 5 Innovationen

  2. Linux – Was sind High Memory und Low Memory unter Linux?

  3. Was bedeutet __init im Linux-Kernel-Code?

  4. Was bedeutet &am Ende eines Linux-Befehls?

  5. Was sind High Memory und Low Memory unter Linux?

Dmesg-Befehl unter Linux

Was ist der Unterschied zwischen macOS- und Linux-Kernels

Was ist die Shell unter Linux?

Was ist die Linux-Prozesstabelle? Woraus besteht es?

Wie viel RAM verwendet der Kernel?

Welche Prozesskiller hat Linux?