虚拟存储器
1.物理和虚拟寻址
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址。
CPU访问内存的最自然的方式就是使用物理地址。这种方式称为物理寻址。
提供给程序员的内存模型仅仅是物理内存,一组从0到某个最大值的地址,每个地址通常对应一个字节单元。
在这种情况下,内存中不可能同时有两个正在运行的程序。如果第一个程序写了一个新值到比如
addr 2000
,这将擦除第二个程序存储在那里的值。
示例:
有两个程序,每个程序的大小为16 KB。前者为阴影区域。
- 第一个程序从
addr 24
开始,addr 24
包含一个MOV
指令。 - 第二个程序从
addr 28
开始,addr 28
包含一个CMP
指令。 - 当两个程序从地址0开始在内存中连续加载时,有图(c)的情况。
- 在第一个程序运行后,操作系统可能决定运行第二个程序,该程序已加载在第一个程序之上,
addr 16384
。执行的第一个指令是jmp 28
,它跳转到在第一个程序中的ADD
指令,而不是它应该跳转到的CMP
指令。
核心问题是这两个程序都引用绝对物理内存。
现代处理器一般使用虚拟寻址。
CPU通过生成一个虛拟地址(Virtual Address,VA)来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址。
将一个虚拟地址转换为物理地址的任务叫做地址翻译(address translation)。
CPU芯片上叫做内存管理单元(Memory Management Unit, MMU)的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。
2.工作原理
虚拟存储器通过在主存和辅存之间增加部分软件和硬件,使主存和辅存构成整体,如同大容量主存一样。
利用虚拟存储器提供的虚拟地址进行编程,在主存空间不增加的情况下不受主存空间的限制。
- 虚拟存储器充分利用程序局部性,采用按需加载方式。
- 不直接将程序和代码载入主存,仅在相应的虚拟地址转换表登记虚拟地址对应磁盘地址。
- 程序执行并访问对应虚拟地址时,产生缺页异常,由操作系统从磁盘调入数据块。
- 程序仅加载一小部分空间即可运行,提高主存利用率。
地址空间
虚拟存储器有三种地址空间:
虚拟地址空间:程序员用来编写程序的空间,虚地址
主存地址空间:物理地址空间,或叫实地址空间,实地址
辅存地址空间:磁盘的地址空间,辅存地址
3.页式虚拟存储器
以页(Page)为逻辑划分信息传送单位。
虚拟地址划分
虚拟地址被划分为虚拟页号(Virtual Page Number,VPN)和虚拟页偏移(Virtual Page Offset,VPO),物理地址也被划分为物理页号和物理页偏移。
页表
页表是一张保存虚拟页号VPN和物理页号PPN对应关系的查找表。
VPN作为索引进行访问,每个表项包括有效位、物理页号、修改位等。