进程的虚拟地址空间
每个进程都有自己的虚拟地址空间。
- 对于32位进程来说,这个地址空间的大小为4GB, 因为32位指针可以表示地址在0x00000000~0xFFFFFFFF间的任意值。
- 对于64位进程来说,这个地址空间的大小为16EB(即千亿亿字节)
每个进程都有自己专有的地址空间, 当进程中的各线程运行时,它们只能访问属于自己的内存。线程既看不到属于其他进程的内存, 也无法访问它们。
例如,进程A在位于它的进程地址空间内的0x12345678地址处存储了一个数据结构, 而进程B在位于它进程地址空间中也有地址为0x12345678。但是它们却不是相同的数据。
最后,所谓虚拟地址空间,即是虚拟的。 并没有实际的物理存储器。 这个地址空间不过是一个内存地址区间。为了能够正常读/写数据, 操作系统需要把物理存储器分配或映射到相应的地址空间。否则将导致访问违规。
虚拟地址空间的分区
虚拟地址空间分区分为以下几区:
- 空指针赋值分区
- 用户模式分区
- 64KB 禁入分区
- 内核模式分区
空指针赋值分区
这一分区位于进程地址空间0x00000000~0x0000FFFF的闭区间。 保留该分区的目的是为了帮助程序员捕获对空指针的赋值。如果进程中的线程试图读取或写入位于这一分区内的内存地址, 就会引发访问违规。
用户模式分区
这一分区是进程地址空间的