读懂操作系统之虚拟内存基本原理篇(一) (2)

读懂操作系统之虚拟内存基本原理篇(一)

我们看到上述每个PTE是由一个有效位和一个包含物理页号或磁盘地址组成,有效位标识虚拟页是否被缓存在主存中, 若为1则说明该虚拟页已被缓存在主存中,若为0分为两种情况,可能是虚拟内存未创建虚拟页,也有可能是已创建虚拟页但还未缓存到主存,所以虚拟页集合由3个子集组成:【1】虚拟内存系统还未分配或未创建、【2】已缓存在物理内存中的已分配页、【3】未缓存在物理内存中的已分配页。页表在主存中的位置由硬件决定,硬件包含一个指向页表首地址的页表基址寄存器(Page Table Base Register简称PTBR)。简要翻译过程如下图所示

读懂操作系统之虚拟内存基本原理篇(一)

我们进一步得出MMU将虚拟地址映射为物理地址的详细过程:CPU产生虚拟地址,然后从虚拟地址中得到虚拟页号,接下来通过将虚拟页号作为索引去查找页表,通过得到对应PTE上的有效位来判断当前虚拟页是否在主存中,若命中则将对应PTE上的物理页号和虚拟地址中的虚拟页偏移进行串联从而构造出主存中的物理地址,否则未命中(专业名词称为“缺页”),此时MMU将引发缺页异常,从CPU传递到操作系统内核处理缺页异常处理程序,此时将选择一个牺牲页并将对应所缺虚拟页调入并更新页表上的PTE,缺页处理程序再次返回到原来的进程,再次执行缺页指令,CPU重新将虚拟地址发给MMU,此时虚拟页已存在物理内存中,所以命中,最终将请求的字返回给处理器。详细过程如下:

读懂操作系统之虚拟内存基本原理篇(一)

进程的地址空间以及它在主存中可以访问的所有数据,都由驻存在主存中的页表所定义,操作系统只是简单的加载页表寄存器用来指向它所想激活的进程页表,而不是保存整个页表。由于不同进程使用相同的虚拟地址,因此每个进程有各自的页表,操作系统负责分配物理主存和更新页表,因为我们通过将页表分离来保护进程,进而保证不同进程的虚拟地址空间不会发生任何冲突。上述我们已经得知,一个32位逻辑地址空间的系统,每个页面的大小为4KB(2^12),那么页表将包含(2^32/2^12)= 大约100万个页表条目即PTE,假设每个条目占4个字节,那么每个进程的页表将占用(4*(2^32/2^12))= 4MB的内存。

TLB加快地址翻译

我们知道每次CPU产生一个虚拟地址就必须通过MMU去查询页表从而得到PTE,若我们将页表放在寄存器中,虽然加速了查询但限制了页表的大小,实际上页表是放在主存上,虽然页表可以很大,但是访问会很慢,因为程序访存至少需要两次:第一次访存获取物理地址、第二次访存获得数据。提高访问性能的关键在于依靠页表的访问局部性,当一个转换的虚拟页号被使用时,它可能在不久的将来会被再次用到,因为对该页中字的引用同时具有时间局部性和空间局部性。为了消除这样的开销,在MMU中包括一个关于PTE的小的缓存,称为翻译后备缓冲器(Translation-Lookasice Buffer简称TLB),有些书中被称为快表,所以TLB存在的目的是:用于记录最近使用地址的映射信息的高速缓存,也就是缓存虚拟页到物理页(页帧)的映射(翻译),从而可以避免每次都访问页表,所以TLB的本质是缓存页表。TLB是一个小的、虚拟寻址的缓存,其中每一行都保存着一个由单个PTE组成的块,TLB大概包含64-1024个PTE。如下图所示

读懂操作系统之虚拟内存基本原理篇(一)

从虚拟页号中提取出用于组选择和行匹配的索引和标记字段,如果TLB有 T= 2^t个组,那么TLB索引(TLBI)是由VPN的t个最低位组成,而TLB标记(TLBT)是由VPN中剩余的位组成。上述我们了解到虚拟地址由虚拟页号和虚拟页偏移量组成,在这里再进行补充,虚拟地址由虚拟页号(VPN)、虚拟页偏移量(VPO)、TLBI(TLB索引)、TLBT(TLB标记)组成,对于物理地址由物理页号(PPN)、物理页偏移量(PPO)、缓冲块内的字节偏移量(CO)、高速缓存索引(CI)、高速缓存标记(CT)组成。那么利用TLB加快地址翻译的整个大概过程是怎样的呢?CPU产生一个虚拟地址,MMU从虚拟地址中提取出虚拟页号,然后从TLB中根据虚拟页号取出相应的PTE,进而通过物理页号和虚拟页偏移构造出物理地址,将其发送到高速缓存/主存,高速缓存/主存将返回的数据返回给CPU(现代操作系统都已有SRAM的高速缓存(一级缓存、二级缓存、三级缓存),因为地址翻译硬件发生在访问高速缓存之前,所以我们到底是通过虚拟地址还是物理地址访问高速缓存呢?大多数都是选择物理地址访问高速缓存)。整个过程如下图:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwfzf.html