目录
1、什么是进程地址空间
小故事:假如有一个大富翁,有100亿资产,有10个私生子(因为是私生子,所以不知道其他人的存在)。大富翁对每个私生子都说:如果你以后好好学习,就可以继承这100亿资产。所以每个私生子都认为自己能独占100亿资产。
说人话就是:大富翁给每个私生子都画了一张大饼,每个私生子都以为自己能独占100亿资产。
对应到计算机就是:大富翁(操作系统)、大饼(进程地址空间)、私生子(进程)、100亿资产(物理内存)。
每个进程都有一个进程地址空间,都以为自己在独占物理内存。
因为系统中有大量的进程,每个进程都有一个地址空间,所以操作系统要对地址空间进行管理(先描述,再组织),地址空间就是一个结构体struct mm_struct。
总结:进程地址空间就是内核中的一种数据结构类型,struct mm_struct,本质就是操作系统给进程画的饼,在32位机器中,这个饼也就是地址空间有4GB。
2、地址空间中各个区域的划分
划分区域的本质就是:一个整形的开始到另一个整形的结束。
进程地址空间也是相同的划分方法。
这里只有start和end,但是每个进程都可以认为mm_struct可以代表整个内存,且所有的地址为0x000...0 ~ 0xFFF...F。每个进程都认为地址空间的划分是按照4GB空间划分的,每个进程都认为自己拥有4GB。
通过页表将虚拟地址转化为物理地址。
3、为什么要存在地址空间?
1、通过添加一层软件层,完成有效的对进程操作内存进行风险管理(权限管理),本质是为了保护物理内存以及各个进程的数据安全。
例如:如果进程直接访问物理内存,如果进程中的代码出现越界,可能会直接将其他进程的代码和数据修改了,这样是不安全的。
2、将内存的申请和内存的使用的概念,在时间上划分清楚,通过虚拟地址空间,来屏蔽底层申请内存的过程,达到进程读写内存和操作系统进行内存管理操作进行软件上的分离。
例如:我们申请了100个字节,但是我们可能存在暂时不会全部使用的情况,站在操作系统的角度,你申请就立马给你,是不是整个系统会有一部分空间,本来可以给别人立马用的,现在却被你占着。所以将内存申请和内存使用分开,当你要进行内存读写操作再给你。
3、站在cpu和应用层角度,进程统一可以看作统一使用4GB空间,而且每个空间区域的相对位置是确定的。