上图是通过二级页表虚拟地址映射物理地址的流程图
简单的介绍下:
取出一级页表基地址(mmu c2寄存器中)的高18位和虚拟地址的高12位、低两位为large page的标志01组成了一级映射中存放相应二级映射的地址。通过一级映射中对应地址的值,我们就可以找到与二级映射中的地址有关的数据,这次只把2-9位用虚拟地址中的2-9位代替,低两位用small page的标志10组成,这样就得到了二级映射的地址。经过查询我们得到了相应二级页表中的内容,从而得到了所对应的物理地址。
如果这种解释方法太抽象,我们将用另一种解释方法:
我们把虚拟地址分成3个部分,高12位,中间8位和低12位。一级页表中用到的是虚拟地址中的高12位,这十二位可以当做一级页表的下标(页表的结构类似于数组),二级页表用到的是中间8位。其中一级页表项的内容是以1M方式对齐的(xxx00000),这里的1M是指与一级页表项对应的物理地址以1M方式对齐。二级页表项的值是以4k方式对齐的(xxxyy000),4k是指二级页表项对应的物理地址是以4k方式对齐。一级页表项(xxx00000)->二级页表项(xxxyy000)->物理内存(xxxyyzzz),其中zzz是指4k块大小中的偏移量。一级页表的大小是4k,二级页表的大小是256字节。
我们在程序中看一下二级页表的建立:
ttb_init 通过流程图建立一级页表和二级页表
一级页表项对应物理内存以1M递增,二级页表项对应物理内存以4K递增(0x100)。