Die folgende Abbildung zeigt, wie ein virtueller Adressraum eines 32-Bit-Prozesses aufgeteilt wird:
Aber wie wird ein virtueller Adressraum eines 64-Bit-Prozesses aufgeteilt?
Akzeptierte Antwort:
x86
Die virtuelle 64-Bit-x86-Speicherkarte teilt den Adressraum in zwei Teile:Der untere Abschnitt (mit dem obersten Bit auf 0 gesetzt) ist der Benutzerraum, der obere Abschnitt (mit dem obersten Bit auf 1 gesetzt) ist der Kernel-Raum. (Beachten Sie, dass x86-64 „kanonische“ Adressen der „unteren Hälfte“ und der „höheren Hälfte“ definiert, wobei eine Anzahl von Bits effektiv auf 48 oder 56 begrenzt ist; siehe Wikipedia für Details.)
Die komplette Karte ist detailliert im Kernel dokumentiert; derzeit sieht es so aus
Startadresse | Versatz | Endadresse | Größe | VM-Bereichsbeschreibung |
---|---|---|---|---|
0000_0000_0000_0000 | 0000_7fff_ffff_ffff | 128 TiB | virtueller Benutzerspeicher | |
0000_8000_0000_0000 | +128 TiB | ffff_7fff_ffff_ffff | ~16 Mio. TiB | nicht kanonisch |
ffff_8000_0000_0000 | -128 TiB | ffff_ffff_ffff_ffff | 128 TiB | virtueller Kernel-Speicher |
mit virtuellen 48-Bit-Adressen. (Die 56-Bit-Variante hat die gleiche Struktur, mit 64 PiB nutzbarem Adressraum auf beiden Seiten eines 16K-PiB-Lochs.)
(Beachten Sie, dass 16KPiB =16MTiB =2 Byte.)
Im Gegensatz zum 32-Bit-Fall ist die „64-Bit“-Speicherzuordnung eine direkte Widerspiegelung von Hardwareeinschränkungen.
ARM
64-Bit-ARM hat eine ähnliche Adressunterscheidung in der Hardware:Die obersten sechzehn Bits sind 0 für den Benutzerbereich und 1 für den Kernelbereich. Linux verwendet 39, 42 oder 48 Bit für virtuelle Adressen, abhängig von der Anzahl der Seitentabellenebenen und der Seitengröße. Bei ARMv8.2-LVA werden weitere vier Bits hinzugefügt, was zu virtuellen 52-Bit-Adressen führt.
Dies ist auch ausführlich im Kernel dokumentiert.