系统与程序的内存布局
在我们开始内核调试之前,首先我们需要对系统的内存内核层与应用层的布局有一个基本认识。以X86为例,X86支持32位寻址,因此可以支持最大232=4GB的虚拟内存空间(当然也可以通过PAE将寻址空间扩大到64GB,PAE即Physical
address extension,x86的处理器增加了额外的地址线以选择那些增加了的内存,所以实体内存的大小从32位增加到了36位。最大的实体内存由4GB增加到了64GB)。如下图所示,在

X64(AMD64)的内存布局与X86的内存布局类似,不同的地方在于各自空间的范围和大小不同,同时X64下还存在着一些空洞(hole)。在X64内存理论上支持最大264的寻址空间,但实际上这个空间太大了,目前根本用不完,因此实际上的X64系统一般都只支持到40多位(比如Windows支持44位最大寻址空间为16TB,Linux 支持48位最大寻址空间256TB等),支持的空间达到了TB级别。但是,无论是在内核空间还是在应用层空间,这些上TB的空间并不都是可用的,存在着所谓的空洞(HOLE)。

分区 |
X86 32位 Windows |
X64 64位 Windows |
空指针 赋值 分区 |
0x00000000 0x0000FFFF |
0x00000000'00000000 0x00000000'0000FFFF |
用户模式 分区 |
0x00010000 0x7FFEFFFF |
0x00000000'00010000 0x000007FF'FFFEFFFF |
64KB禁入 分区 |
0x7FFF0000 0x7FFFFFFF |
0x000007FF'FFFF0000 0x000007FF'FFFFFFFF |
内核模式 分区 |
0x80000000 0xFFFFFFFF |
0x00000800'00000000 0xFFFFFFFF'FFFFFFFF |
