概述
在系统中所有的进程之间是共享CPU和主存内存资源的。当进程数量变多时,所需要的内存资源就会相应的增加。可能会导致部分程序没有主存空间可用。此外,由于资源是共享的,那么就有可能导致某个进程不小心写了另一个进程所使用的内存,进而导致程序运行不符合正常逻辑。
操作系统提供了一种对主存的抽象的概念,叫做虚拟内存(VM)。
虚拟内存
是 硬件地址翻译、主存、磁盘文件和内核软件间的完美交互,他为每个进程提供了一个大的、一致的,私有的地址空间。
物理和虚拟寻址
计算机的主存可以看做是一个由 M 个连续的字节大小的单元组成的数组。每个字节都有一个唯一的物理地址(Physical Address,PA)。第一个字节的地址为 0,接下来的地址为 1,以此类推。CPU 访问内存的最简单的方式是使用物理寻址(physical addressing)。
物理寻址
该图例的上下文是一条加载指令,它读取从物理地址 4 处开始的 4 字节字。CPU 在执行这条指令的时候,生成一个有效物理地址,通过内存总线,把这个物理地址传递给主存,主存取出从物理地址4处开始的 4 个字节字,然后将它返回给 CPU,CPU 将它存放在一个寄存器里。早期使用物理寻址的系统通常都比较简单,比如数字信号处理器,计算器等嵌入式设备。
虚拟寻址
现在处理器(CPU)采用的是一个程序虚拟寻址(virtual addressing)的寻址方式。
如上图所示:
CPU 通过程序编译生成一个虚拟地址(virtual address,VA)来访问主存,这个虚拟地址在被送到主存之前会先转换成一个物理地址。
将虚拟地址转换成物理地址的任务叫做地址翻译(address translation),地址翻译需要 CPU 硬件和操作系统之间的配合。
CPU 芯片上叫做内存管理单元(Menory Management Unit, MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。
地址空间
地址空间(address space)是一个非负整数 地址 的有序合集:{0,1,2,… }
地址空间
在一个带虚拟内存的系统中,CPU 从一个有 N= 2 的 n 次方个地址的址空间中生成虚拟地址,这个地址空间就称为虚拟地址空间:{0,