Ich habe einige Handbücher über Seitenverzeichnisse und Seitentabellen gelesen und bin immer noch sehr verwirrt über diese Konzepte. Zum Beispiel here Ich fand, dass nur eine einzige Ebene Paging Speicherverschwendung ist. So verwenden wir in x86
Architektur 2-Level-Paging.Seitenverzeichnisse verstehen
cr3 --> PageDirectory --> PageTable --> Page
Betrachten Sie die folgende lineare Adresse.
01001010101 1010101101 10101110101010
page tbl page offset
Mit page tbl
Bits finden wir die physische Adresse des Seitenverzeichniseintrags. PD = cr3 + L * (page tbl)
enthält die physikalische Adresse der Seitentabelle PT
. Jetzt suchen wir nach unserer Seite P = PT + L * page
. Also hatten wir in einer Ebene eine Seitentabelle 4MiB. Jetzt haben wir 1024 Seitentabellen 4KiB = 4MiB insgesamt. Sparmodus nicht sehen.
Was habe ich vermisst?
4 MB zusammenhängender physischer Speicher pro Prozess ist eigentlich ziemlich viel. Auf meinem Linux-Desktop laufen derzeit 151 User-Space-Prozesse (multi-threaded-Prozesse zählen immer noch zu 1). (Ich habe Kernel-Prozesse ausgeschlossen, weil sie keine eigenen Seitentabellen haben). Das wären 604MiB allein auf Seitentabellen. –
@PeterCordes Ja, irgendwie ... Aber trotzdem, wenn wir alle 1024 Seitentabellen zugeteilt haben, werden wir die gleichen 4MB Speicher für die Seitentabelle haben. Die Sache ist nicht all diese 1024 Seitentabellen sind zugeordnet, richtig? –
Ja, genau. Mein Kommentar macht nur zusammen mit @ Fuzs Antwort Sinn: Die Speicherkarten der meisten Prozesse sind sehr spärlich, besonders in einem 64-Bit-System. –