图解MMU

2021-04-21 10:12:08 浏览数 (1)

这是图解系列之MMU

MMU叫内存管理单元,现在是处理器/核中的一个硬件单元,通常每个核有一个MMU。

下面cloud3图解一下MMU的工作原理。

CPU发出的地址是虚拟地址,MMU通过页表技术,把虚拟地址转换为物理地址,再去访问物理内存条。

CPU发出的虚拟地址由两部分组成:VPN和offset,VPN(virtual page number)是页表中的条目number,而offset是指页内偏移。

最终转换后的物理地址也有两部分:PFN和offset,PFN( Physical frame number)是物理页框number,offset和上面虚拟地址的offset相同,是页内偏移。

MMU由两部分组成:TLB(Translation Lookaside Buffer)和table walk unit。TLB 是一种地址转换cache,这里我们略过TLB的工作细节。

table walk unit在不同的CPU架构上有不同的叫法,但其作用是相同的,就是把内存页表走一走进行查表,完成虚拟地址到物理地址的转换。

下面以32位处理器来描述MMU和内存页表的工作流程。

假设只有一级页表

如果采用4KB的page大小,cpu发出的虚拟地址包含12bit的页内偏移和20bit的页表VPN:

这里的12bit的页内偏移是和4KB的页大小一致的,2的12次方正好能覆盖一个页。20bit的VPN就是页表中的条目数。

所以页表和物理内存是下面这个样:

从上图可以看页表条数和物理内存的页数是相同的,因为每一个物理页地址都需要页表中的一条来指向,不然就覆盖不全了。

物理内存是4KB*1M=4GB,内存页表是32bit*1M=4MB。

需要指出,这里的物理内存大小不是物理内存条大小,而是可以访问到物理内存最大大小。

页表里放着什么:

页表中的每一条叫做页表条目PTE(page table entry),其大小为4个字节。

任何一个虚拟地址,都可以用地址的高20位(由于一页是4KB,低12位就页内偏移)来表示,所以PTE的低12位可做他用。

低12位中,P表示是否命中。如果某一条目没有命中,则其他位就没有意义了。所以页表是这个样:

以这张页表为例, 当CPU发出的虚拟地址中页表Index是3时,MMU会去查页表的第3行,发现第3行没有命中,MMU会给CPU发出page fault,CPU自动跳到fault的代码去处理fault。当CPU发出的虚拟地址中页表Index是2时,MMU会去查页表的第2行,发现第2行命中了物理地址112*4KB,MMU会访问内存条112*4KB这个物理地址。

操作系统中每个进程都有自己的页表,当CPU在运行某个进程时,MMU的页表地址寄存器中会放置这个进程页表的物理地址,根据这个地址找到此进程的页表,然后根据此表进行地址转换。

上面我们已经介绍了每个页表的大小是4MB,覆盖了整个0-4GB的虚拟地址空间。每个进程都占用4M的物理地址,而且这个空间还必须是连续的。那整个操作系统的所有进程光页表就要消耗很大的物理内存。

假设只有2级页表

对于32位地址空间,会将VPN中的前10位用于索引页表目录(一级页表),紧接下来的10位用于索引所选的页表(二级页表)。

换言之,对于2级页表结构其本质是:VPN的前10位为页表目录索引,而接下来的10位为页表索引,剩下的10位为page offest。

MMU先根据一级页表的物理地址和一级页表Index去一级页表中找PTE,PTE中的地址不再是最终的物理地址,而是二级页表的物理地址。

根据二级页表物理地址和二级页表index去二级页表中找PTE,此时PTE中的地址才是真实的物理地址。

根据此物理地址和offset找到最终的物理内存地址。

一级页表占用的内存是4bit*2的10次方=4KB,每个二级页表占用的内存是4bit*2的10次方=4KB。

使用二级页表的好处是如果一级页表中的某一个PTE没有命中,那这一PTE对应的整个二级页表就不存在。

以上以32位系统中一级和二级页表来描述了MMU的最简单原理,多级页表的实现方式在理论上也是相同的,包括在64位系统中MMU工作原理也是如此。

这是图解系列之MMU

0 人点赞