内存管理单元MMU只使用一级页表:VA转化成PA是以段的方式进行转换
(1)工作原理:结合下图,CPU发出的虚拟地址VA分成两部分p1和p2,p1:在建立的页表区进行索引,p2:实际映射的物理段内的偏移量;TTB Base是一级页表的基地址,即存放自己建立的一级页表在内存中起始地址,这个地址是由协处理器CP15的C2寄存器来装载的,因此只需要往C2寄存器塞值就可以实现一级页表起始位置的确定。TTB Base+p1就可以定位到一级页表里面的存放的某个段的物理基地址和这个段的属性,这个得到的值叫做MVA。有了内存中物理地址的段基址,再加上偏移量p2就可以实现物理内存的定位,这样就实现了VA到PA的映射。总体的原理就是这样。
(2)如何建立页表:在初始化好MMU和启动之前,要先建立好页表。下面就只是用一级页表的方式进行说明。
一级页表的描述符格式一共有4种,如下图:
只要将描述符格式的bit0和bit1依次设置成0和1就是以段转换方式进行VA和PA的转换,其他位的作用是用来设置域、cache和writebuffer的使能、访问权限设置,看看韦东山的代码就一目了然了,这里就不多解释。建立页表的核心工作在于代码上如何实现VA到PA的映射,思路就是这样的,先确定一级页表中描述符的位置,然后往这个位置写入段的格式内容,例如:*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xfff00000) | mmu_sec_desc;
具体如何配置还是看看ARM920T手册再结合着代码来分析更加清晰一些。裸机测试的程序流程如下: