Benutzerraum und Systemraum

Windows bietet jeder Benutzermodusanwendung einen Block virtueller Adressen. Dies wird als Benutzerbereich dieser Anwendung bezeichnet. Auf den anderen großen Adressblock, der als Systemspeicher oderKernelspeicher bezeichnet wird, kann nicht direkt von der Anwendung zugegriffen werden.

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 zuerst den Prozesskontext verwenden, um den Benutzermodusprozess anzugeben, der den Adressraum besitzt, indem Sie .process /i (oder einen prozessspezifischen Haltepunkt für eine Kernel-Mode-Funktion) verwenden, um den Zielprozess auf den richtigen Prozesskontext umzustellen.

Haltepunkte im Benutzerbereich sind immer dem Prozess zugeordnet, dessen Prozesskontext aktiv war, wenn die Haltepunkte festgelegt wurden. Wenn ein Benutzermodus-Debugger diesen Prozess debuggt und ein Kernel-Debugger den Computer debuggt, auf dem der Prozess ausgeführt wird, bricht dieser Haltepunkt in den Benutzermodus-Debugger ein, obwohl der Haltepunkt tatsächlich aus dem Kernel-Debugger gesetzt wurde. Sie können an diesem Punkt vom Kerneldebugger aus in das System eindringen oder den Befehl .breakin (Break to the Kernel Debugger) aus dem Benutzermodusdebugger verwenden, um die Kontrolle an den Kerneldebugger zu übergeben.

Bestimmen des Bereichs des Benutzerbereichs und des Systemraums

Wenn Sie den Umfang des Benutzerspeichers und des 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 höchsten Punktes im Benutzerbereich. Da Systemspeicheradressen immer höher als Benutzerspeicheradressen sind, können Sie anhand dieses Werts ermitteln, ob eine bestimmte Adresse sich 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 Systembereich reicht daher von 0x80000000 bis zur höchsten möglichen Adresse (die bei einer Standardmäßigen 32-Bit-Windows-Installation 0xFFFFFFFF ist).

Bei einem 64-Bit-Zielcomputer treten unterschiedliche Werte auf. Dieser Befehl kann z. B. Folgendes anzeigen:

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

Dies gibt an, dass der Benutzerbereich von 0x00000000'00000000 bis 0x000007FF'FFFEFFFF reicht. Daher enthält der Systembereich alle Adressen von 0x00000800'000000000 nach oben.

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