1. 什么是虚拟地址空间
- 如果没有虚拟地址空间,则程序都是直接访问和操作物理内存。可能会造成以下问题
- 用户程序可以访问任意物理内存,容易破坏操作系统。
- 多个进程之间使用物理内存可能会产生冲突。导致bug
- 如果使用了虚拟地址空间。
- 虚拟地址空间由操作系统管理
- 操作系统为每一个进程分配一个0~4G的虚拟内存地址空间(私有)。这样每一个进程只能访问自己的虚拟地址空间。而虚拟地址空间到物理地址空间的映射由操作系统来完成。即操作系统负责实际内存的分配。
2. 虚拟地址空间与物理地址空间映射解决了什么问题
- 方便编译器和操作系统安排程序的地址分布。
- 程序可以使用一些列相邻的虚拟地址来访问物理内存中不相邻的内存缓冲区。
- 方便进程之间相互隔离
- 不同进程使用的虚拟地址彼此隔离,一个进程的代码无法更改正在由另一个进程使用的物理内存
- 方便操作系统管理物理内存
- 程序可以使用一系列虚拟地址来访问大于可用的物理内存的内存缓冲区。利用程序的局部性原理,当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为4KB)保存到磁盘文件。数据或者代码页会根据需要在物理内存和磁盘之间移动。
3. 虚拟内存的技术实现
虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。
3.1 请求分页存储管理
- 操作系统将内存划分成大小相等的物理块
- 要运行作业时,不需要将作业所需的全部地址空间同时装入内存。
- 所以需要引入请求调页功能和页面置换功能。
- 在作业开始运行前,仅装入当前要执行的部分段即可运行,假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到内存,同时操作系统也可以将暂时不用的页面置换到外存中。
3.2 请求分段存储管理
- 建立在分段存储管理之上,增加了请求调段功能和分段置换功能
- 在作业开始运行之前,仅装入当前要执行的部分段即可运行;
- 在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;
- 但当内存空间已满,又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。
3.3 请求段页式存储管理
4. MMU内存管理单元
4.1 什么是MMU
- 是个物理组件,位于CPU内部
- 功能一:管理虚拟存储器、物理存储器的控制线路,实现虚拟地址到物理地址的映射。
- 功能二:修改内存的访问级别。
4.2 MMU如何实现虚拟地址到物理地址的映射
- 大多数使用MMU的机器都是采用分页机制。虚拟地址空间以页为单位进行划分,而相应的物理地址空间也被划分,其使用的单位称为页帧。页帧与也必须保持相同。内存与外部存储器之间的传输是以页为单位进行传输的。
- 虚拟内存的页面映射到物理内存的哪个页帧是通过页表来描述的。页表保存在物理内存中。MMU会查找页表来确定VA(虚拟地址)应该映射到什么PA(物理地址)。
4.3 操作系统如何与MMU相互配合实现地址映射
- 操作系统在初始化或分配、释放内存时会执行一些指令在物理内存中填写页表。然后用指令设置MMU,告诉MMU页表在物理内存的什么位置。
- 设置好了之后,CPU每次执行访问内存的指令都会自动引发MMU做查表和地址转换操作。地址转换操作由硬件自动完成,不需要用指令控制MMU去做。
4.4 操作系统如何与MMU配合实现内存保护机制
- 处理器一般会有用户模式和特权模式之分。
- 操作系统可以在页表中设置每个页表项访问权限,有些页表项不可以访问,有些页表项只能在特权模式下访问。有些页表项在用户模式和特权模式都可以访问
- 同时,访问权限又分为可读、可写和可执行三种。
- 这样设定之后,当CPU要访问一个VA(virtual address)时,MMU会先检查CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令执行。
- 如果与操作系统设定的权限相符,则运行访问,把VA转换为PA
- 否则不允许执行,产生异常