虚拟存储器是非常重要的一个概念。先抽丝剥茧的了解下什么是虚拟存储器,再理解下虚拟存储器有什么作用。
一、什么是虚拟存储器
(1)虚拟存储系统通过虚拟地址寻址;
(2)虚拟地址和物理地址通过页表实现一一映射;
(3)页表存放在主存中;
物理寻址和虚拟寻址
存放在存储器中每一个字节都有一个地址,这个地址称为物理地址(PA, physical address)。处理器通过物理地址访问数据的方式称为物理寻址。处理器也可以通过虚拟地址(VA, visual address)寻址,称为虚拟寻址。处理器生成一个虚拟地址来访问处理器,在地址到达存储器之前需要先转换为物理地址。存储器管理单元负责将虚拟地址转换为物理地址。
物理地址由物理页号(PPN)和物理偏移量构成(PPO)。虚拟地址由虚拟页号(VPN)和虚拟偏移量构成(VPO)。一般情况下,物理偏移量等于虚拟偏移量,物理页号和虚拟页号通过页表实现映射。
页表
计算机的存储结构包括:高速缓存(SRAM),主存储器(DRAM)以及磁盘(固态硬盘或者机械硬盘)。处理器从缓存中取数据,如果缓存没命中,处理器从主存中取数据。如果主存也没命中,处理器就先要把需要的数据从磁盘中搬运到主存中,再从主存中取数据。如何判断数据是否在主存中,我们需要一个东西,叫做页表(PTE, page table entry)来告诉我们数据是否在主存中。页表由有效位和一个n位地址字段组成。如果有效位为1,则地址段放置虚拟页在磁盘上的起始物理地址,虚拟页典型值为4K-2M。页表只有三种状态,a.未分配。地址段上没有数据。b.已缓存。地址段上有数据,有效位为1,表明该虚拟页数据都缓存在主存中。c.未缓存。地址段上有数据,有效位为0。如下图所示,页表共有八项,其中PTE0,PTE5未分配,PTE1,PTE2,PTE4, PTE7已缓存,PTE3,PTE6未缓存。
因此,处理器访问主存有两种状态,一是页命中,数据缓存在主存中,二是缺页,数据没有缓存在主存中。虚拟页号VPN与PTE是一一对应的,例如VPN0-PTE0, VPN1-PTE1等等。
地址翻译
地址翻译由以下几个步骤组成:
(1)处理器生成虚拟地址,传给MMU;
(2)MMU提取虚拟页号VPN,传送给高速缓存/主存;
(3)通过高速缓存/主存中页表,查询虚拟页号对应的PTE内容,并返还给MMU;
(4)如果有效位为0,进入第五步,有效位为1,进入第八步;
(5)MMU触发异常,处理器进入缺页异常处理程序;
(6)缺页异常处理程序从磁盘中调入新的页面,更新进PTE页表中;
(7)CPU重新发送虚拟地址,进入第二步;
(8)MMU构造物理地址,并将地址送给高速缓存/主存;
(9)高速缓存/主存返回数据给处理器
二、加快地址翻译
TLB
翻译后备缓冲器(TLB,translation lookaside buffer)。TLB是一个小的,虚拟地址缓存,其功能相当于高速缓存,特别的,作为页表的高速缓存。TLB存放在处理器中,因此,处理器可以非常快速的从TLB中取出PTE。
TLB由标记位和索引位构成。相当于全相联高速缓存。处理器访问数据步骤如下:
(1)处理器产生虚拟地址;
(2)如果TLB 命中,TLB返回PTE给MMU;如果不命中,MMU从高速缓存中取出PTE,放在TLB中,覆盖已经存在的条目。
(3)MMU根据PTE生成物理地址,并将它发送给高速缓存或者主存;
(4)高速缓存或者主存返回数据给处理器
多级页表
TLB解决了访问速度的问题,多级页表可以解决页表占用空间大小的问题。假设地址空间为32位,则处理器最高可访问4GB的存储器,假设存储器物理页大小为4K,每个PTE占用4个字节。则页表大小为4MB,意味着主存中至少留下4MB空间用来存放页表。这无疑是一种浪费,使用多级页表可以压缩页表大小。
一级页表每个PTE对应4MB虚拟页,总共需要1024个PTE可以映射4GB虚拟地址空间。二级页表每个PTE对应4KB虚拟页,1024个二级PTE可以映射4MB虚拟地址空间。如果一级页表的PTE为空,则对应的二级页表就根本不会存在,如图中的PTE2/3/4/5/6/7等。这大大节省了主存的空间。一级页表总是存放在主存中,只有需要二级页表时,虚拟存储器系统才会创建,调入或调出二级页表。
三、虚拟存储器作用
虚拟存储器是硬件异常,硬件地址翻译,主存,磁盘文件和内核软件的完美交互,为每个进程提供了一个大的,一致的和私有的地址空间。主要有三个作用:
(3)保护进程的地址空间不被其他进程破坏。
虚拟存储器作为缓存的工具
在虚拟存储系统中,可以将主存看成是一个存储在磁盘上的地址空间的高速缓存。处理器通过页表可以知道物理页有没有缓存在主存中。
虚拟存储器作为存储器管理的工具
虚拟存储器为每个进程提供了一致的地址空间,简化存储器管理。
(1)简化链接
(2)简化加载
(3)简化共享
(4)简化存储器分配
笔者对于链接,加载这些过程都不了解,因此只将大概记录下来,日后有所了解,再做补充。详情可以参考《深入理解计算机系统》9.4节
虚拟存储器作为存储器保护的工具
在示例中,PTE添加了三个许可位。SUP位表示进程是否必须运行在内核(超级用户)模式下才能访问,运行在内核模式下的进程可以访问任何页面。运行在用户模式下的进程只能访问SUP值为0的页面。READ和WRITE位控制处理器对页面的读和写访问。
如果一条指令违反了许可条件,CPU将会触发一个保护故障,将控制传递给一个内核中的异常处理程序。