由于个人对虚拟内存这块特别感兴趣,所以就直接暂且跳过其他,接下来将通过几篇文章进行详细讲解,当然其他基础内容后续在我进行相应整体学习后也会同步输出文章,比如操作系统概念、程序链接、进程管理、页面置换算法、流水线、浮点指令、内存管理、磁盘管理等内容。不管周遭的环境如何,毕竟还很菜,坚持每天让自己进步一点点,放下暂时的焦虑,不如专注于眼前的学习,跟着我一起学习操作系统吧。
虚拟存储器设计初衷缓存从高到低,主存可作为磁盘的缓存,我们将这项技术称作为虚拟存储器,基于历史观点,构造虚拟存储器的主要出于两个目的,其一是允许云计算在多个虚拟机之间有效而安全的共享存储器,其二则是受限的主存容量对程序设计所造成的极大影响。有了虚拟存储器这样可确保每个程序只能对划分给它的那部分主存进行读写操作,而主存只需存放程序中的活跃区域。虚拟存储器实现程序地址空间到物理地址的转换,通过这种转换处理加强了各个程序地址之间的保护。若用户加载多个程序直接到主存,很显然最终可能会超过主存的容量,如此一来,将程序进行卸载或转入成为程序员不可推卸的责任,加重了程序员的负担,那么怎样才能将程序员从这种情况中解放出来呢?现代操作系统将主存提供了一种对主存的抽象概念,叫作虚拟内存,虚拟内存是硬件异常,硬件地址翻译、主存、磁盘文件和内核软件的完美交互,虚拟内存主要提供了三种能力:【1】将主存看成是一个存储在磁盘上的地址空间的高速缓存(作为缓存)【2】为每个进程提供一致的地址空间,从而简化内存管理(作为内存管理)【3】防止每个进程的地址空间被其他进程所破坏(作为内存保护)。
映射原理:CPU生成一个虚拟地址(Virtual Address简称VA)来访问主存,但是在此之前需要将虚拟地址转换为物理地址,这个过程称作为地址转换或地址映射或地址翻译,为进行此操作需要CPU硬件和操作系统合作,通过内存管理单元(Memory Management Unit)上的地址翻译硬件,利用存储在主存上的查询表来翻译虚拟地址,该表的内容由操作系统管理。
页表地址翻译虚拟内存系统将虚拟内存划分为固定大小的块,这个块我们称作为虚拟页(Virtual Page简称VP),同理将物理内存划分为物理页(Physical Page简称PP),也叫页帧(Page Frame)。这里我们需要明白虚拟地址、虚拟页、物理地址、物理页这四者之间的联系。如下图,通过CPU产生虚拟地址访问主存的物理地址,而虚拟存储器和物理存储器分别被划分成虚拟页和物理页,所以结果变成将虚拟页映射到物理页。
在虚拟存储器中,地址被划分为虚页号(Virtual Page Number简称VPN)和虚拟页页偏移(Virtual Page Offset简称VPO),如下为从虚拟页到物理页号(Physical Page Number简称PPN)的转换。物理页构成物理地址的高位部分,而页偏移保持不变,构成物理地址的低位部分。页偏移的位数决定了页的大小,当然,虚拟页地址可寻址的页数与物理地址可寻址的页数可以不同。
例如具有32位逻辑地址的操作系统,如果每个页面的大小为4KB,由于上述物理页号有18位,那么存储器物理页数为2^18,因此,逻辑上最多可以支持1GB的主存,但是实际上虚拟地址空间可支持4GB,如此为解决主存的受限控制。和缓存机制一样,我们必须有某种机制来判断一个虚拟页是否缓存在DRAM中某一个地方,如果是,那么系统必须确定这个虚拟页存放在哪个物理页中,如果未命中,系统必须确定这个虚拟页存储在磁盘的哪个位置,然后在物理内存中选择一个牺牲页,并将虚拟页从磁盘复制到DRAM中,然后替换这个牺牲页。此功能由软硬件共同提供,包括操作系统软件、MMU中的地址翻译硬件、存放在物理内存中的页表(Page Table简称PT)所决定,上述将虚拟页映射到物理页就是通过查询页表实现,一个页表是由页表条目(Page Table Entry简称PTE)的数组组成。如下为页表简要信息版本: