计组-虚拟地址-上

虚拟内存

为什么要有虚拟内存?

一个系统中的进程总是共享着cpu以及主存资源,但是当一个系统同时运行很多程序的时候就存在问题了。

  1. 不同的进程可能会不小心修改其他进程正在使用的内存,从而导致意想不到的错误。
  2. 当并行程序多的时候每个程序可以使用的内存就会变得很小,程序的性能收到影响,影响用户体验,并且会加剧上述1的情况。

虚拟内存能提供什么?

为每个进程提供一个较大的私有的一致的地址空间。并且它所做的所有事情对于上层开发人员,是透明的,上层开发人员只需要享受这些福利。

它的工作机制是怎样的?

在虚拟存储器中有三种地址空间:

  1. 虚拟地址空间(虚地址 VA)
  2. 主存地址空间(物理地址 PA)
  3. 赋存地址空间(磁盘地址)

当CPU通过VA寻找指令或者数据的时候首先将VA交给MMU(存储管理控制部件),这个MMU主要的作用就是通过查位于主存上的地址表将VA转化为PA,然后访问主存数据返还给CPU。大致的工作流程就是这样。接下来我们一步步进行详细分析。
常见的虚拟存储器将以页为单位进行数据的替换,查找。虚拟地址被划分一个虚拟页号(VPN)和虚拟偏移(VPO)。物理页地址被划分一个物理页号(PPN)以及物理偏移(PPO)。
image-20210603220535499

虚拟地址与实地址的低位被划分为偏移,页偏移的大小也相同。
物理地址与虚拟地址的映射表一般常驻内存,并且每个进程都有自己的页表,页表采用VPN作为索引进行访问,每个表项主要包括有效位以及PPN,读写权限,模式访问权限等信息。页表属于进程控制信息,存放在进程地址空间的内核区。页表在主存中的首地址记录在页表基址寄存器PTBR中。进程切换的时候只用PTBR中的基址值就可以替换页表了。

image-20210603221027846

磁盘的空间被划分为交换分区以及数据分区,交换分区主要存放主存中的页面换出的动态修改的数据。数据分区用于存储程序和数据。主存和磁盘的地址空间合称为虚拟地址空间。
image-20210603221833555

MMU使用VA查找PA的时候只需将VA中的VAN取出加上PTBR中的值就是主存之中PTE(页表项)的地址,再把VPO直接加在PPN后边就可以得到PA了。
我们来看一下虚拟地址的完整访问流程
image-20210603222255010

上图为页命中的情况:
CPU使用VA访问MMU,MMU则根据PTBR的值以及VAN得到PTEA访问主存的PTE,若是当前页有效(还在主存之中,找到了物理页号,并且有效)就是用PA访问主存,主存直接将数据返回给CPU.
image-20210603222652965

当发生缺页的情况:
刚开始同样是MMU访问主存中的PTE,但是这次返回的PTE却是无效的,表明要访问的页不在主存之中,MMU触发异常调用OS的缺页异常程序,从磁盘调入页到主存并且更新所有进程的页表,MMU从步骤2开始工作。
image-20210603223250885

由于cache经常缓存CPU经常用到的数据,因此会把部分连续的页表项置换到cache当中,MMU访问cache的时候就可能先访问到页表项并且拿到了PA这样MMU再次访问先访问cache看其是否命中如是不命中就将页表数据置换进cache并从MMU中取数据。

由于cache缓存页表项的颗粒度较大(就是一次缓存一个数据块)。为了提高缓存的命中概率处理器维护一个TLB(转换旁路缓冲区)专门缓存经常用到的页表项。由于TLB表离CPU很近经常称之为块表将主存包括cache当中的表称之为慢表。
现代处理器一般在查询PA的时候会同时查询块表与慢表,块表如果查到就停止慢表的查找。

image-20210603224531410

由于页表需要OS与硬件同时工作(缺页异常处理,页表的维护),当开机的时候OS还没有完全启动(引导完成前)CPU只能采用物理地址访问主存(实模式),引导完成后进入保护模式(虚地址模式)。

posted @ 2021-06-03 22:55  沙雕货  阅读(346)  评论(0编辑  收藏  举报