在32位的Windows系统中,线性地址最大只支持4GB,也就是0xffffffff。根据MSDN,用户空间的范围是0x00000000~0x7ffeffff,而系统空间的范围则是0x80000000~0xffffffff。

仔细一看你就会发现,用户空间和系统空间之间不是连续的。0x7fff0000~0x7fffffff这64kb的空间既没有被划入用户空间,也没有被划分给系统空间。那么这段地址到底去了哪里?
考据过程
资料较少
在Linus中,0x7fff0000~0x7fffffff作为物理地址,被划分给了ACPI(高级配置与电源接口)。它确实有提到0x7ffeffff,但它是物理地址,我们开头讲的是线性地址。如果你感兴趣的话,MSFN上有个2008年讨论Windows98的帖子,提到在Win98中这段物理地址也是用于ACPI(System board extension for ACPI BIOS)
Linux的线性地址空间也分为内核进程和用户进程可访问的两部分地址,但它们之间是连续的(用户:0x00000000~0xbfffffff 内核:0xcfffffff~0xffffffff)当然,在Windows上我们也可以通过内存分析工具RAMMap去看自己电脑的内存分布。不过它只能看到很小一部分的线性地址以及大部分的物理地址,对解决这个问题的帮助不大。
最后还是只能谷歌,发现0x7fff0000~0x7fffffff这段地址是禁止访问的。图中说的是用于防止线程传递跨越了用户空间和系统空间的缓冲区。我的个人理解是像缓冲区溢出那种,当它读写到0x7ff0000这个地址,程序就会直接报”访问越界“一类的错误。
