1. 进程的虚拟地址空间
每个进程都会有自己的虚拟地址空间,对于一个32位的进程来说,它拥有4GB(2的32次方, 字节)大小的地址空间。对于一个64位的进程来说,它拥有16EB大小的地址空间。每个进程的地址空间是相互隔离的,当进程内的各个线程在执行时,只能访问自己进程内的内存,无法访问其它进程的内存。即进程A的线程无法访问进程B的地址空间的数据结构,反之亦然。 但实际上,进程并没有真正拥有这么大的地址空间,这些空间只是虚拟的,并不是真正的物理空间。为了进程能够正常地读/写数据,实际上需要将物理存储器分配或映射到虚拟的地址空间。
2.虚拟地址空间的分区
每个进程的虚拟地址空间被划分为多个分区,包括如下:
1)空指针赋值分区
这一分区的是从0x00000000到0x0000FFFF的闭区间,该分区的目的是为了帮助程序员捕获空指针的赋值,如果进程中的线程试图去读取或写入位于这一分区内的内存地址,就会引发违规访问。
2)用户模式分区
这一分区的地址空间因不同的CPU体系而有所区别。 进程无法通过指针来读取、写入或其它任何方式来访问在这一分区中的其它进程的数据。对所有应用程序来说,进程的大部分数据都保存在这一分区。
3)64KB禁入分区
4)内核模式分区
这一分区是操作系统使用的,与线程调度、内存管理、文件系统支持、网络支持以及设备驱动程序相关的代码都会载入到该分区,这一分区内的任何东西为所有进程共有。如果一个应用程序试图读取或写入位于该分区中的内存地址,将引发访问违规。