Handbuch zur dynamischen Ablaufverfolgung in Solaris

Zeiger und Adressräume

Ein Zeiger ist eine Adresse, die innerhalb eines virtuellen Adressraums eine Übersetzung für einen physischen Speicherbereich liefert. DTrace führt D-Programme innerhalb des Adressraums für den Betriebssystemkernel selbst aus. Das Solaris-System verwaltet zahlreiche Adressräume: davon einen für den Betriebssystemkernel und einen für Benutzerprozesse. Da jeder Adressraum scheinbar auf den gesamten Speicher des Systems zugreifen kann, lässt sich derselbe virtuelle Adresszeigerwert in den verschiedenen Adressräumen wieder verwenden und in unterschiedliche physische Speicherbereiche übersetzen. Deshalb müssen Sie beim Schreiben von D-Programmen die Adressräume der Zeiger beachten, die Sie verwenden möchten.

Wenn Sie beispielsweise mit dem Provider syscall den Eintritt in einen Systemaufruf instrumentieren, der einen Zeiger auf eine Ganzzahl oder einen Vektor von Ganzzahlen als Argument annimmt (z. B. pipe(2)), ist eine Dereferenzierung des Zeigers oder Vektors mit einem der Operatoren * oder [] nicht zulässig, da sich die betreffende Adresse in dem Adressraum des Benutzerprozesses befindet, der den Systemaufruf durchgeführt hat. In D würde die Anwendung des Operators * oder [] auf diese Adresse einen Zugriff auf den Kernel-Adressraum bedeuten, der einen Fehler aufgrund ungültiger Adresse oder die Rückgabe unerwarteter Daten an das D-Programm zur Folge hätte. Dies hängt davon ab, ob die Adresse zufällig mit einer gültigen Kernel-Adresse übereinstimmt oder nicht.

Um über einen DTrace-Prüfpunkt auf den Benutzerprozess-Speicher zuzugreifen, müssen Sie eine der in Kapitel 10Aktionen und Subroutinen beschriebenen Funktionen copyin(), copyinstr() oder copyinto() auf den Benutzer-Adressraumzeiger anwenden. Achten Sie beim Schreiben von D-Programmen darauf, Variablen für Benutzeradressen angemessen zu benennen und zu kommentieren. Sie können dadurch einiges an Durcheinander verhindern. Alternativ können Sie Benutzeradressen als uintptr_t speichern und somit der Gefahr aus dem Weg gehen, dass Sie D-Code schreiben, der diese dereferenziert. Verfahren zum Verwenden von DTrace für Benutzerprozesse sind in Kapitel 33Ablaufverfolgung von Benutzerprozessen beschrieben.