2016-05-31 15 views
2

Ich brauche die physikalische Adresse einer großen Seite (2 MB) von User-Space. Ich habe es geschafft, die physikalische Adresse einer normalen 4-KB-Seite aus einer Pagemap zu bekommen, wie in https://shanetully.com/2014/12/translating-virtual-addresses-to-physcial-addresses-in-user-space/#codeprocpidpagemapcode gezeigt, aber ich verstehe nicht, wie ich pagemap verwenden soll, um die physikalische Adresse einer riesigen Seite zu erhalten. Wie wird die Seitenzahl eines großen Seitenrahmens in der Seitenübersicht dargestellt? Alle Referenzen und besonders jedes Stück Code würden sehr geschätzt.Wie bekomme ich die physikalische Adresse einer großen Seite

+1

Haben Sie die [Dokumentation für Pagemap] (https://www.kernel.org/doc/Documentation/vm/pagemap.txt) gelesen? Es ist sogar von dem Link verwiesen, den Sie angegeben haben. Insbesondere der Abschnitt, der "COMPOUND_HEAD" und "COMPOUND_TAIL" beschreibt. – kaylum

+0

Ich habe in der Pagemap-Dokumentation gesucht, aber unter dem RIESIGEN Abschnitt, der nicht viel gesagt hat. Also nach COMPOUND_HEAD und COMPOUND_TAIL sollte der Anfang meines 2 MB-Puffers der Kopf sein, daher sollte jeder Platz in den ersten 4 KB meines Puffers dem PFN der gesamten großen Seite zugeordnet werden? Wie soll ich den Wert dann interpretieren? Sollte ich 9 Nullen am Ende des PFN erwarten? Und betrachten Sie Bit 10 und höher als die physikalischen Speicherbits, die meinen Offset erweitern? – alex10791

Antwort

1

Es sollte das gleiche sein. Der Hauptunterschied zwischen normalen Seiten und großen Seiten sind einige Ebenen der Seitentabellen. Der Seitentischspaziergang endet früh für große Seiten (zumindest auf x86).

Große Seiten enden im Allgemeinen in mehr Nullen als typische Seiten, da sie an ihre Größe angepasst werden müssen (im Fall von 2 MB sollten die niedrigen 21 Bits alle null sein).

Wenn Sie immer -EINVAL von Ihrem liest, lesen Sie in diesem Zitat aus dem pagemap documentation (Beispiel liest die falsche Anzahl von Bytes):

aus einem der Dateien zu lesen, wenn Sie zurückkehren -EINVAL sind nicht Starten des Lesens auf einer 8-Byte-Grenze (zB, wenn Sie eine ungerade Anzahl der Bytes in die Datei gesucht), oder wenn die Größe der gelesenen ist kein mehrere von 8 Bytes.

+0

Aber es könnte auch nicht dasselbe sein. Lassen Sie mich wissen, welchen Fehler Sie bekommen und ich werde sehen, ob ich verstehen kann, warum. – ruthafjord

+0

Vielen Dank, es scheint im Moment zu funktionieren. Ich bemerkte, dass ich Adressen mit vielen abschließenden Nullen bekam, die zwar sinnvoll waren, aber ich wusste nicht genau, es war nur eine Beobachtung, auf die ich mich nicht blind verlassen konnte. Danke noch einmal – alex10791