-
Das Kernel-Mapping existiert hauptsächlich für die Zwecke des Kernels, nicht für Benutzerprozesse. Aus Sicht der CPU könnte jede physische Speicheradresse, die nicht als lineare Adresse abgebildet wird, genauso gut nicht existieren. Aber die CPU muss in der Lage sein, den Kernel aufzurufen:um Interrupts zu bedienen, Ausnahmen zu behandeln ... Sie muss auch in der Lage sein, den Kernel aufzurufen, wenn ein Benutzerprozess einen Systemaufruf ausgibt (es gibt verschiedene Möglichkeiten, dies zu tun passieren, also werde ich nicht ins Detail gehen). Auf den meisten, wenn nicht allen Architekturen geschieht dies ohne die Möglichkeit, Seitentabellen zu wechseln – siehe zum Beispiel
SYSENTER
. Einstiegspunkte in den Kernel müssen also immer mindestens in den aktuellen Adressraum gemappt werden. -
Kernel-Zuweisungen sind dynamisch, der Adressraum jedoch nicht. Auf 32-Bit-x86 sind verschiedene Splits verfügbar, z. B. der in Ihrem Diagramm gezeigte 3/1-GiB-Split; Auf 64-Bit x86 ist die obere Hälfte des Adressraums für den Kernel reserviert (siehe Memory Map in der Kernel-Dokumentation). Diese Spaltung kann sich nicht bewegen. (Beachten Sie, dass Bibliotheken in den Userspace geladen werden. Kernelmodule werden in den Kernelspace geladen, aber das ändert wiederum nur die Zuordnungen, nicht die Aufteilung des Adressraums.)
-
Im Benutzermodus gibt es eine einzige Zuordnung für den Kernel, die von allen Prozessen gemeinsam genutzt wird. Wenn sich eine Kernel-seitige Seitenzuordnung ändert, wird diese Änderung überall widergespiegelt.
Wenn KPTI aktiviert ist, hat der Kernel seine eigenen privaten Zuordnungen, die beim Ausführen von User-Space-Code nicht offengelegt werden; Bei KPTI gibt es also zwei Zuordnungen, und Änderungen an der Kernel-Private-Zuordnung sind für den Benutzerbereich nicht sichtbar (was der springende Punkt von KPTI ist).
Die Kernel-Speicherkarte bildet immer den gesamten Kernel ab (im Kernel-Modus, wenn KPTI ausgeführt wird), aber sie ist nicht unbedingt eins zu eins – auf 64-Bit-x86 enthält sie beispielsweise eine vollständige Karte des physischen Speichers, also sind alle physischen Adressen des Kernels vorhanden mindestens zweimal zugeordnet.