用户空间和系统空间
Windows 为每个用户模式应用程序提供一个虚拟地址块。 这称为该应用程序 的用户空间 。 应用程序无法直接访问另一个大型地址块(称为 系统空间 或 内核空间)。
当 WinDbg 或 CDB 在用户空间中设置 断点 时,此断点在单个进程的用户空间中的指定地址处设置。 在用户模式调试期间,当前进程确定虚拟地址的含义。 有关详细信息,请参阅 控制进程和线程。
在内核模式下,可以使用 bp、 bu 和 ba 命令或“断点”对话框在用户空间中设置 断点 。 必须先使用 进程上下文 来指定用户模式进程,该进程使用 .process /i (或某些内核空间函数上的特定于进程的断点) 将目标切换到正确的 进程上下文。
用户空间中的断点始终与进程上下文在设置断点时处于活动状态的进程相关联。 如果用户模式调试器正在调试此进程,并且内核调试器正在调试运行该进程的计算机,则此断点会中断到用户模式调试器中,即使断点实际上是从内核调试器设置的。 此时,可以从内核调试器中断系统,或者从用户模式调试器使用 .breakin (Break to the Kernel Debugger) 命令将控制权转移到内核调试器。
确定用户空间和系统空间的范围
如果需要确定目标计算机上的用户空间和系统空间范围,可以使用内核调试器中的 dp (Display Memory) 命令显示 Windows 全局变量 MmHighestUserAddress。 此变量包含用户空间顶部的地址。 由于系统空间地址始终高于用户空间地址,因此可以使用此值确定任何给定地址是在用户空间中还是在内核空间中。
例如,在具有 x86 处理器和标准启动参数的 32 位目标计算机上,此命令将显示以下结果:
kd> dp nt!mmhighestuseraddress L1
81f71864 7ffeffff
这表明用户空间的范围从地址0x00000000到0x7FFEFFFF,因此系统空间的范围从0x80000000到在标准 32 位 Windows 安装) 上0xFFFFFFFF的最高可能地址 (。
对于 64 位目标计算机,将发生不同的值。 例如,此命令可能会显示以下内容:
0: kd> dp nt!mmhighestuseraddress L1
fffff800`038b4010 000007ff`fffeffff
这表示用户空间的范围从 0x00000000'00000000 到 0x000007FF'FFFEFFFF。 因此,系统空间包括0x00000800'00000000 以上的所有地址。
有关 Windows 内存管理的详细信息,请参阅 Microsoft Windows Internals by David Solomon 和 Mark Russinovich (第 4 版,Microsoft Press,2005) 。