Was bedeutet das Speicherlayout des virtuellen Kernels in dmesg?

19

Beim Durchlaufen der "Ausgabe von dmesg" konnte ich eine Liste von Werten sehen, die ich nicht richtig verstehen kann.

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 verstehe ich, 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 jede (fixmap, pkmap, .. etc.) wissen (wenn ich mehr Zweifel habe, werde ich jede als separate Frage posten).

Könnte mir das jemand erklären?

Sen
quelle

Antworten:

22

Zunächst einmal hat ein 32-Bit-System 0xffffffff( 4'294'967'295) lineare Adressen, um auf einen physikalischen Ort auf dem RAM zuzugreifen.
Der Kernel unterteilt 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 Kernelspeicher (wenig Speicher) kann nur der Kernel zugreifen.
Der Adressbereich in hexadezimaler und dezimaler Schreibweise:

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

So was:

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

Daher entspricht das Speicherlayout, das Sie gesehen haben dmesg, der Zuordnung von linearen Adressen im Kernelraum.

Erstens die Sequenzen .text, .data und .init, die die Initialisierung der eigenen Seitentabellen des Kernels ermöglichen (in physikalische Adressen linear ü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 Kerneldatensegmente befinden.

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

Der Bereich, in dem sich die Anfangsseitentabellen 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 der Klammer angezeigt, zum Beispiel der Kernel-Code:

0xc071ae6a - 0xc0400000 = 31AE6A

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


Zweitens die Verwendung des Kernelspeichers nach der Initialisierung

lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)

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

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

Die Zuweisung von virtuellem Speicher kann Seitenrahmen basierend auf einem nicht zusammenhängenden Schema zuweisen. Der Hauptvorteil dieses Schemas ist die Vermeidung externer Fragmentierung. Diese wird für Swap-Bereiche, Kernel-Module oder die Zuweisung von Puffern zu einigen E / A-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 mithilfe von kmap () zugeordnet wird, werden von hier aus virtuelle Adressen zugewiesen.

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

Hierbei handelt es sich um fest zugeordnete lineare Adressen, die sich auf eine beliebige physikalische Adresse im RAM beziehen können, nicht nur auf die letzten 1 GB wie die LowMem-Adressen. Lineare Adressen mit fester Zuordnung sind ein bisschen effizienter als die Kollegen mit niedriger Zuordnung und pkmap. Es gibt dedizierte Seitentabellendeskriptoren, die für eine feste Zuordnung zugewiesen sind, und Zuordnungen von HIGHMEM-Seiten unter Verwendung von kmap_atomic werden von hier aus zugewiesen.


Wenn Sie tiefer in den Kaninchenbau eintauchen möchten:
Grundlegendes zum Linux-Kernel

wedeln
quelle
Danke für diese tolle Antwort. Ich würde gerne wissen, warum low mem nicht voll ist 1 GB und mehr über den nächsten Teil des Satzes "weil der Kernel immer mindestens 128 MB an linearen Adressen benötigt, um eine nicht zusammenhängende Speicherzuordnung und fest zugeordnete lineare Adressen zu implementieren."
Sen
Der Kernel muss von Zeit zu Zeit auf Code mit hohem Arbeitsspeicher zugreifen (z. B. BIOS- und ACPI-Informationen befinden sich auf dem ersten MB des Arbeitsspeichers). Dies kann er nicht direkt tun (wie der Lowmem-Bereich), daher muss er Low-Memory zuordnen lineare Adressen mit hohem Speicher, die 128 MB sind nur für diesen Zweck reserviert. Der vmalloc-Bereich ist größtenteils temporär auf Bereiche mit hohem Arbeitsspeicher abgebildet und wird recht schnell neu zugeordnet.
wag
Die vom Kernel für den Aufruf des virtuellen Systems eingerichteten Seiten sind also auch Teil von fixmap ??? Ich bin auf diese Frage gestoßen, weil ich wissen möchte, was genau auf der Seite mit der Adresse fffb5000, fffa1000 usw. liegt. Ich bekomme Overhead bei der Wiedergabe meiner virtuellen Maschinenaufzeichnungen, weil viele virtuelle CPUs auf diese Seite VIEL zugreifen Ich weiß, was genau in dieser Adresse ist ... GROSSE
ANTWORT