1、早期内存分配机制
在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。但是同时存在以下3个问题:1、进程地址空间不隔离。由于程序都是直接访问物理内存,所以恶意程序可以随意修改别的进程的内存数据,以达到破坏的目的。2、内存使用效率低3、程序运行的地址不确定。
为了解决上述问题,人们想到了一种变通的方法,就是增加一个中间层,利用一种间接的地址访问方法访问物理内存。按照这种方法,程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。这样,只要操作系统处理好虚拟地址到物理内存地址的映射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。当创建一个进程时,操作系统会为该进程分配一个4GB大小的虚拟进程地址空间,注意这个4GB的地址空间是“虚拟”的,并不是真实存在,而每个进程只能访问自己虚拟地址空间中的数据,无法访问别的进程中的数据,通过这种方法实现了进程间的隔离。之所以为4GB,是因为在32位的操作系统中,一个指针长度是4字节,而4字节指针的寻址能力是从0x0000 0000~0xFFFF FFFF,最大值0XFFFF FFFF表示的即为4GB大小的容量。
Linux进程虚拟地址空间,总地址空间按3:1的比例划分,用户态占3G,内核占用了1G。各进程的用户虚拟地址空间起始于0,到0XC000 0000的位置,其上为内核