Linux (Ubuntu), Sprache C: Übersetzung von virtueller in physische Adresse

8

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!

    
Jonathan Leffler 05.06.2011, 20:38
quelle

3 Antworten

21

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.

    
Gilles 05.06.2011 20:57
quelle
2

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:

  1. /proc/$pid/maps stellt eine Liste von Zuordnungen mit ihren virtuellen Adressen und der entsprechenden Datei für zugeordnete Dateien bereit.
  2. /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 .

    
ingomueller.net 19.12.2012 09:53
quelle
1

Ü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.

    
Srujan 23.11.2011 20:09
quelle

Tags und Links