虚拟地址空间
- 每个进程拥有独立的虚拟地址空间,CPU的位数决定了最大理论上限;
- 32位计算机的地址空间是0-2^32-1,即4GB;
- C语言中指针的大小通常和虚拟地址空间的位数相同,在32位平台的大小是4个字节。
分配状态:
- 操作系统使用;
- 用户进程,包含了代码、数据以及通过malloc申请的空间等。
问题:程序使用的空间能不能超过4GB?
- 如果是指操作虚拟地址空间,是不能超过的
- 如果是计算机内存空间,是可以操作的,采用PAE的方法进行扩展
PAE:
- Intel使用了36位地址地址线,可以使用64GB的物理内存;
- 由操作系统提供窗口映射,按需要进行申请和映射
- Linux采用mmap()系统调用来实现
装载方式
背景:
- 为了解决实际所需要内存大于物理内存的问题,
- 将常用的部分驻留在内存中(局部性原理),不常用的数据放到磁盘中,按需动态载入。
载入方式分为覆盖载入和页映射。
覆盖载入
背景:
- 虚拟存储发明之前的方式
- 通过覆盖管理器按需加载到内存中
- 模块的依赖关系组织成树状结构,禁止跨树之间的调用
页映射
背景:
- 按照页为单位将内存和磁盘上所有的数据和指令划分为若干页;
- 物理内存满了需要换页,页面置换算法比如:先入先出,最少使用等;
- 每次换页时候需要进行地址重定位,现代硬件通过MMU提供地址转换功能
可执行文件的装载过程
进程的建立过程
上述过程需要做三件事情:
- 创建独立的虚拟地址空间
- 创建映射函数所需要的数据结构
- 读取可执行文件头,建立虚拟空间与可执行文件的映射关系
- 在进程虚拟地址空间中创建虚拟内存区域(VMA)
- 将CPU的指令寄存器设置为可执行文件的入口地址,启动运行
页错误:
- 当程序执行,发生页错误,CPU会将控制权交给操作系统,操作系统会查询VMA,计算出相应的页面在可执行文件中的偏移;
- 然后在物理内存中分配一个页面与虚拟页面建立映射关系;
- 进程从页错误的位置开始执行。