Wie der Titel andeutet, habe ich ein Problem, die physikalische Adresse von einem virtuellen zu erhalten.
Lassen Sie mich erklären: Wie kann ich eine Variable deklarieren, die ich im Prozessraum deklariert habe? Wie kann ich die physikalische Adresse des OS ableiten?
Ich bin auf einige sys-Aufrufe gestoßen: /asm/io.h
, wo die Funktion virt_to_phys()
definiert ist; Es scheint jedoch, dass dieser Header veraltet ist und ich keine Arbeit finden kann.
Jedoch; io.h
ist verfügbar unter: /usr/src/linux-headers-2.6.35-28-generic/arch/x86/include/asm/
. Mein aktueller Kernel ist 2.6.35-28
, aber io.h
ist nicht in /usr/include/asm/
enthalten?
Also, um es noch einmal zu sagen: Ich brauche einen Weg, um die physische Adresse von virtuell zu bekommen. Wird vorzugsweise zur Laufzeit aus der Anwendung abgeleitet. Aber auch eine Umgehung der Verwendung eines Monitors von /proc/PID/maps
reicht.
Irgendwelche Ideen oder Kommentare würden sehr geschätzt werden.
BEARBEITEN Nach einigen Recherchen zu diesem Thema habe ich etwas gefunden, was in dieser Hinsicht hilfreich ist.
Es stellt sich heraus, dass dies mehr als machbar ist, obwohl ein bisschen eine Umgehungslösung erforderlich ist.
Hier ist ein Link zu einer einfachen App, die die aktuell zugeordneten Seiten analysiert.
Die fragliche Datei stellt sich heraus (binäre Datei) /proc/pid/pagemap
(enthält die physische Zuordnung virtueller Seiten). Wie auch immer, der Code in diesem Link kann geändert werden, um als Monitor-App oder so etwas zu dienen.
Ich benötigte die physikalische Adresse für Cache-Simulationszwecke.
Danke für die Hilfe und die Antworten!
Im Benutzercode können Sie die physikalische Adresse einer virtuellen Adresse nicht kennen. Dies bedeutet, dass Informationen nicht außerhalb des Kernels exportiert werden. Es könnte sich sogar jederzeit ändern, besonders wenn der Kernel entscheidet, einen Teil des Prozessspeichers auszulagern.
In /proc/$pid/maps
haben Sie Informationen darüber, was die virtuellen Adressen im Adressbereich Ihres Programms entsprechen (mmapped Dateien, Heap, Stack usw.). Das ist alles, was du bekommst.
Wenn Sie an Kernel-Code arbeiten (was Sie offensichtlich nicht sind), können Sie die physikalische Adresse herausfinden, die einer Seite des Speichers entspricht. Aber selbst dann ist virt_to_phys
nicht die ganze Geschichte; Ich empfehle Linux-Gerätetreiber (besonders die Kapitel 8 und 15 ).
Der Header asm/io.h
ist ein Kernel-Header. Es ist nicht verfügbar, wenn Sie Benutzercode kompilieren, da sein Inhalt einfach keinen Sinn ergibt. Die deklarierten Funktionen sind in keiner Bibliothek verfügbar, nur im Kernel.
Wie vom ursprünglichen Poster teilweise beantwortet, macht der Linux-Kernel seine Zuordnung zum Benutzerland durch eine Reihe von Dateien in /proc
verfügbar. Die Dokumentation finden Sie hier . Kurze Zusammenfassung:
/proc/$pid/maps
stellt eine Liste von Zuordnungen mit ihren virtuellen Adressen und der entsprechenden Datei für zugeordnete Dateien bereit. /proc/$pid/pagemap
bietet weitere Informationen zu jeder zugeordneten Seite, einschließlich der physischen Adresse, falls diese existiert. Wie das ursprüngliche Poster später fand, bietet dieses Beispiel eine Beispielimplementierung für die Verwendung dieser Dateien .
Übergeben Sie die virtuelle Adresse mit systemcall / procfs an den Kernel und verwenden Sie vmalloc_to_pfn . Geben Sie die physische Adresse über procfs / registers zurück.
Tags und Links c linux virtual-memory