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