Поделиться через


Пространство пользователя и системное пространство

Windows предоставляет каждому приложению пользовательского режима блок виртуальных адресов. Это называется пространством пользователя этого приложения. Другой большой блок адресов, известный как системное пространство или пространство ядра, не может напрямую получить доступ к приложению.

Если WinDbg или CDB устанавливает точку останова в пространстве пользователя, эта точка останова устанавливается по указанному адресу в пользовательском пространстве одного процесса. Во время отладки в пользовательском режиме текущий процесс определяет значение виртуальных адресов. Дополнительные сведения см. в разделе Управление процессами и потоками.

В режиме ядра точки останова в пространстве пользователя можно задать с помощью команд bp, bu и ba или с помощью диалогового окна Точки останова . Сначала необходимо использовать контекст процесса , чтобы указать процесс пользовательского режима, которому принадлежит это адресное пространство, с помощью .process /i (или точки останова для определенного процесса в некоторых функциях пространства ядра) для переключения целевого объекта на правильный контекст процесса.

Точки останова в пространстве пользователя всегда связаны с процессом, контекст процесса которого был активен при установке точек останова. Если отладчик пользовательского режима выполняет отладку этого процесса, а отладчик ядра выполняет отладку компьютера, на котором выполняется процесс, эта точка останова прерывается в отладчик пользовательского режима, даже если точка останова была фактически задана из отладчика ядра. На этом этапе можно войти в систему из отладчика ядра или использовать команду .breakin (Break to the Kernel Debugger) из отладчика пользовательского режима, чтобы передать управление отладчику ядра.

Определение диапазона пространства пользователя и системного пространства

Если необходимо определить объем пространства пользователя и системного пространства на целевом компьютере, можно использовать команду dp (Display Memory) из отладчика ядра, чтобы отобразить глобальную переменную Windows MmHighestUserAddress. Эта переменная содержит адрес верхней части пользовательского пространства. Так как адреса системного пространства всегда выше, чем адреса пользовательского пространства, это значение позволяет определить, находится ли какой-либо адрес в пространстве пользователя или в пространстве ядра.

Например, на 32-разрядном целевом компьютере с процессором x86 и стандартными параметрами загрузки эта команда отобразит следующий результат:

kd> dp nt!mmhighestuseraddress L1 
81f71864  7ffeffff 

Это означает, что пространство пользователя находится в диапазоне от адресного 0x00000000 до 0x7FFEFFFF, а системное пространство— от 0x80000000 до максимально возможного адреса (что 0xFFFFFFFF при стандартной 32-разрядной установке Windows).

На 64-разрядном целевом компьютере будут возникать другие значения. Например, эта команда может показать следующее:

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

Это означает, что пользовательский диапазон составляет от 0x00000000'00000000 до 0x000007FF'FFFEFFFF. Таким образом, системное пространство включает все адреса от 0x00000800'000000000 до .

Дополнительные сведения об управлении памятью Windows см. в статье Microsoft Windows Internals by David Solomon and Mark Russinovich (4th edition, Microsoft Press, 2005).