1.概述
在早期的操作系统中,程序规模小,以致于物理内存可以容纳程序。但随着应用程序的规模越来越大,现有的物理内存已经无法容纳这样规模的程序了。为了解决这个难题,虚拟存储器技术应运而生。其基本原理是程序的规模可以超过实际的物理内存,操作系统首先将程序内容的一小部分存储在物理内存中,将剩余的大部分内容放在下一级存储器,如磁盘等,后续根据需要交换物理内存与磁盘的内容,从而实现超过实际物理内存的程序正常运行。
虚拟存储器的大小由处理器的位数决定,32位的处理器对应4GB的虚拟存储空间,64位的处理器对应TB的虚拟存储空间。
未使用虚拟存储器技术前,CPU访问物理内存流程如下图所示,
使用了虚拟存储器技术,CPU访问物理内存流程如下图所示,
使用虚拟存储器技术,每个程序可以独占整个地址空间,当多个应用程序同时运行时,操作系统动态地将物理内存分配给各个程序,并将其虚拟地址转换为物理地址,从而确保各个程序的正常运行。除此之外,虚拟存储器技术还可以实现对程序的保护和程序间的共享。
2.基于分页的虚拟存储器技术
简单来说,虚拟地址空间以页(page)为单位划分,通常页的大小为4KB,物理地址空间以帧(frame)为单位划分,帧的大小必须与页的大小相等,也为4KB。
下面是一个示例,假如处理器为16位,虚拟地址空间大小为64KB,每个页大小为4KB,被分为16个页,即VPN(virtual page number)等于16。假如物理内存大小为32KB,每个帧大小为4KB,被分为8个帧,即PFN(physical frame number)等于8。现有一个大小大于32KB的程序,当程序执行时,不能一次性将程序全部放入到物理内存中,所以需要下一级存储器可以存放程序。
将虚拟地址翻译为物理地址的功能模块被称为内存管理单元(Memory Manage Unit, MMU)。
Load R4, 1[R3];
当执行以上指令时,取数据的虚拟地址为R3+1=1(假设R3=0),该地址属于page0,page0被映射到frame2,翻译后的物理地址为8192+1=8193。
Load R4, 1[R3];
当执行以上指令时,取数据的虚拟地址为R3+1=32769(假设R3=32768),该地址属于page8,page8未被映射到物理内存地址空间,而是存放在磁盘中。此时MMU会产生一个Page Fault异常发给处理器,处理器需要转到处理Page Fault的异常处理程序并处理异常(该异常处理程序为操作系统代码),它需要从物理内存中找到当前很少使用的frame。假如frame2被选中,需要先将frame0与page0的映射关系解除,此时page0被标记为未映射状态,然后把page8的内容从磁盘中搬移到物理内存frame0,并将page8映射到frame0。如果被替换的frame0是脏(dirty)的,那么需要先将frame0的内容搬移到磁盘。处理完后,就可以从Page Fault的异常处理程序中返回,返回到产生该异常的load指令,并重新执行load指令。