进程内存地址

32位Windows内核系统涉及的进程内存地址。(64位Windows请参考其他资料)

进程的虚拟地址空间

每个进程都有自己的虚拟地址空间。对32位进程来说,这个地址空间的大小为4GB,这是因为32位指针可以表示从0x00000000到0xFFFFFFFF之间的任一值。每个进程都有自己专有的地址空间,当进程中的各线程运行时,它们只能访问属于该进程的内存。线程既看不到属于其他进程的内存,也无法访问它们。如前所述,每个进程都有自己私有的地址空间。进程A可以在位于它的地址空间内德0x12345678地址存储一个数据结构,而进程B也可以在自己的地址空间内存储一个完全不同的数据结构——同样位于0x12345678地址处。当进程A的线程访问位于地址0x12345678处的内存时,他们访问的是进程A的数据结构。当进程B中的线程访问位于地址0x12345678处的内存时,它们访问的是进程B的数据结构。进程A中的线程无法访问位于进程B的地址空间内的数据结构,反之亦然。


虚拟地址空间的分区

每个进程的虚拟地址空间被划分成许多分区(partition)。由于地址空间的分区依赖于操作系统的底层实现,因此会随着Windows内核的不同而略有变化。用户模式分区默认为2G。如果>2G,<=3G也被准许,这种情况暂不作考虑。

1)空指针赋值分区

范围:0x0000 0000~0x0000 FFFF

为了帮助程序员捕获对空指针的赋值。

分配内存时,如果由于某种原因分配不成功,则返回空指针0x0000 0000。当用户继续使用比如改写数据时,系统将因为发生访问违规而退出。

2)用户模式分区

范围:0x0001 0000~0x7FFE FFFF

进程只能读取或访问这个范围的虚拟地址,超越这个范围的行为都会产生违规退出。

所有.exe和动态链接库(DLL文件)都载入到这一区域,进程的大部分数据也都保存在这一分区。每个进程该分区空间是独享的。

3)64KB禁入分区

范围:0x7FFF 0000~0x7FFF FFFF

没有了解

4)共享内核分区

范围:0x8000 0000~0xFFFF FFFF

这个空间是供操作系统内核代码、设备驱动程序代码、设备I/O高速缓存、非分页缓冲池分配表、进程页面表等。这段地址各进程是共享的,但进程不能读取或者访问这一分区。     


部分摘自:<Windows核心编程>(第5版)                     

你可能感兴趣的:(进程内存地址)