Freigeben über


Benutzer- und Systembereich

Windows gibt jeder Anwendung im Benutzermodus einen Block von virtuellen Adressen. Dies wird als Benutzerbereich dieser Anwendung bezeichnet. Auf den anderen großen Adressblock, der als System- oder Kernelspeicherplatz bezeichnet wird, kann die Anwendung nicht direkt zugreifen.

Wenn WinDbg oder CDB einen Haltepunkt im Benutzerbereich festlegt, wird dieser Haltepunkt an der angegebenen Adresse im Benutzerbereich eines einzelnen Prozesses festgelegt. Während des Debuggens im Benutzermodus bestimmt der aktuelle Prozess die Bedeutung virtueller Adressen. Weitere Informationen finden Sie unter Steuern von Prozessen und Threads.

Im Kernelmodus können Sie Haltepunkte im Benutzerbereich mit den Befehlen bp, bu und ba oder mit dem Dialogfeld Haltepunkte festlegen. Sie müssen zunächst den Prozesskontext verwenden, um den Benutzermodusprozess anzugeben, der den Adressraum besitzt, indem Sie .process /i (oder einen prozessspezifischen Haltepunkt in einer Kernelbereichsfunktion) verwenden, um das Ziel in den richtigen Prozesskontext zu wechseln.

Haltepunkte im Benutzerbereich sind immer dem Prozess zugeordnet, dessen Prozesskontext beim Festlegen der Haltepunkte aktiv war. Wenn ein Benutzermodusdebugger diesen Prozess debuggen und ein Kerneldebugger den Computer, auf dem der Prozess ausgeführt wird, debuggen, wird dieser Haltepunkt in den Benutzermodusdebugger eingebricht, obwohl der Haltepunkt tatsächlich vom Kerneldebugger festgelegt wurde. Sie können an dieser Stelle über den Kerneldebugger in das System einbrechen oder den Befehl .breakin (Break to the Kernel Debugger) aus dem Benutzermodusdebugger verwenden, um die Steuerung an den Kerneldebugger zu übertragen.

Bestimmen des Bereichs des Benutzer- und Systembereichs

Wenn Sie den Umfang des Benutzer- und Systemspeichers auf dem Zielcomputer ermitteln müssen, können Sie den Befehl dp (Anzeigespeicher) aus einem Kerneldebugger verwenden, um die globale Windows-Variable MmHighestUserAddress anzuzeigen. Diese Variable enthält die Adresse des oberen Bereichs des Benutzerbereichs. Da Systemraumadressen immer höher als Benutzerraumadressen sind, können Sie mit diesem Wert bestimmen, ob sich eine angegebene Adresse im Benutzerbereich oder im Kernelbereich befindet.

Auf einem 32-Bit-Zielcomputer mit einem x86-Prozessor und Standardstartparametern zeigt dieser Befehl beispielsweise das folgende Ergebnis an:

kd> dp nt!mmhighestuseraddress L1 
81f71864  7ffeffff 

Dies gibt an, dass der Benutzerbereich von der adresse 0x00000000 bis zu 0x7FFEFFFF reicht und der Systemspeicherbereich daher von 0x80000000 bis zur höchstmöglichen Adresse reicht (die bei einer standardmäßigen 32-Bit-Windows-Installation 0xFFFFFFFF wird).

Bei einem 64-Bit-Zielcomputer treten unterschiedliche Werte auf. In diesem Befehl kann beispielsweise Folgendes angezeigt werden:

0: kd> dp nt!mmhighestuseraddress L1 
fffff800`038b4010  000007ff`fffeffff 

Dies gibt an, dass der Benutzerbereich von 0x00000000'000000000 bis 0x000007FF'FFFEFFFF reicht. Daher umfasst der Systemraum alle Adressen ab 0x00000800'0000000000.

Weitere Informationen zur Windows-Speicherverwaltung finden Sie unter Microsoft Windows Internals von David Solomon und Mark Russinovich (4. Edition, Microsoft Press, 2005).