彻底搞懂虚拟内存,虚拟地址,虚拟地址空间( 四 )


好了,概念介绍到这里,先来看看虚拟地址翻译物理地址的过程,按照一级页表来演示,如下图所示:

彻底搞懂虚拟内存,虚拟地址,虚拟地址空间

文章插图
虚拟地址翻译物理地址
上图为虚拟地址翻译物理地址的示意图,可以看出VPO等于PPO 。
下面看看计算机各个部件是怎么通过虚拟地址访问物理内存的 。
处理器根据虚拟地址访问物理内存的分为页表项命中和页表项未命中两种情况,页表项命中意味着页表项的有效位为1,页表项存储的是物理页号,虚拟页缓冲在物理页中,未命中意味着页表项有效位为0,此时需要发送缺页中断 。
页表项命中的步骤如下图:
彻底搞懂虚拟内存,虚拟地址,虚拟地址空间

文章插图
页表项命中翻译步骤
1.CPU将虚拟地址(VA)送入MMU,MMU根据页表基址寄存器中页表的起始地址加上虚拟页号,找到了页表项的物理地址PTEA 。
2.MMU将PTEA送入到高速缓冲或者内存 。
3.从高速缓冲或者内存中找到页表项(PTE),返回页表项(PTE)给MMU 。
4.MMU根据PTE找出物理页号,然后加上虚拟页偏移量形成物理地址(PA),送入到高速缓冲或者内存 。
5.高速缓冲或者内存获取数据,返回数据给处理器 。
页表项未命中的步骤如下图:
彻底搞懂虚拟内存,虚拟地址,虚拟地址空间

文章插图
页表项未命中翻译步骤
1.CPU将虚拟地址(VA)送入MMU,MMU根据页表基址寄存器中页表的起始地址加上虚拟页号,找到了页表项的物理地址PTEA 。
2.MMU将PTEA送入到高速缓冲或者内存 。
3.从高速缓冲或者内存中找到页表项(PTE),返回页表项(PTE)给MMU 。
4.MMU根据PTE,发现页不在内存中,未命中,因此MMU发送一个缺页中断,交由缺页异常处理程序处理 。
5.缺页异常处理程序根据页置换算法,选择出一个牺牲页,如果这个页面已经被修改了,则写出到磁盘上,最后将这个牺牲页的页表项有效位设置为0,存入磁盘地址 。
6.缺页异常程序处理程序调入新的页面,如果该虚拟页尚未分配磁盘空间,则分配磁盘空间,然后磁盘空间的页数据拷贝到空闲的物理页上,并更新PTE的有效位为1,更新物理页号,缺页异常处理程序返回后,再回到发生缺页中断的指令处,重新按照页表项命中的步骤执行 。
虚拟地址翻译物理地址的过程介绍完了,另外要说的是现代的CPU和操作系统为了加快虚拟地址翻译物理地址的过程,做了以下两点优化:
1.建立了虚拟号(VPN)和页表项(PTE)的映射关系,存储在TLB中,当MMU根据虚拟地址获取页表项时,先查询TLB,在TLB找到了页表项后,就不需要从高速缓冲或者内存中获取了,找不到了才会计算页表项地址PTEA,然后再从高速缓冲或者内存中获取页表项(PTE) 。
2.某些热点物理地址对应的数据,存储在L1缓冲中,MMU根据物理地址获取页表项或者代码数据时,先从L1缓冲中获取,找不到再从内存中获取 。
上述的翻译过程是通过一级页表来翻译,现在操作系统支持多级页表,多级页表与一级页表比较类似,如下图所示:
彻底搞懂虚拟内存,虚拟地址,虚拟地址空间

文章插图
K页表
上图为K级页表,页表基址寄存器存储的是一级页表的地址,1到K-1的页表的每一项存储的下一级页表的起始地址,K级页表的每一项存储的是物理页号或者磁盘地址 。
好了,关于虚拟地址,虚拟内存,虚拟地址空间的话题就介绍到这里了 。




推荐阅读