Wie ist unter einem modernen 64-Bit-x86-Linux die Zuordnung zwischen virtuellen und physischen Seiten auf der Kernelseite eingerichtet? Auf der Benutzerseite können Sie mmap
Seiten aus dem Seitencache einfügen, wodurch 4K-Seiten direkt dem Benutzerbereich zugeordnet werden. Ich bin jedoch daran interessiert, wie die Seiten auf der Kernelseite zugeordnet werden.
Verwendet es die "gesamte RAM-Identitätszuordnung" oder etwas anderes? Verwendet diese gesamte RAM-Identitätszuordnung im Allgemeinen 1 GB Seiten?
linux
linux-kernel
mmap
memory-management
BeeOnRope
quelle
quelle
Antworten:
Auf einem modernen 64-Bit x86 Linux?
Ja. Es ruft
kmap()
oder aufkmap_atomic()
, aber auf x86-64 verwenden diese immer die Identitätszuordnung. x86-32 hat eine spezifische Definition davon, aber ich denke, x86-64 verwendet eine generische Definition in include / linux / highmem.h .Und ja, die Identitätszuordnung verwendet 1 GB große Seiten.
LWN-Artikel, in dem kmap_atomic erwähnt wird .
Ich habe kmap_atomic () gefunden, indem ich mir den PIO-Code angesehen habe . [*]
Wenn read () / write () Daten aus / in den Seitencache kopiert:
generic_file_buffered_read -> copy_page_to_iter -> kmap_atomic () erneut.
[*] Ich habe mir PIO angesehen, weil mir klar wurde, dass der Kernel beim Ausführen von DMA zum / vom Seitencache die Verwendung von Zuordnungen vermeiden konnte. Der Kernel könnte einfach die physikalische Adresse auflösen und an die Hardware übergeben :-). (Vorbehaltlich IOMMU). Der Kernel benötigt jedoch eine Zuordnung, wenn er zuerst die Daten prüfen oder verschlüsseln möchte.
quelle