ARMv6 架构下MMU虚拟地址到物理地址二级映射过程

MMU除了能实现虚拟地址到物理地址的二级映射,还能控制映射的4G大小的虚拟地址的访问权限。

要实现标题所述的功能,在ARM 内部需要用到p15协处理器,其中涉及到和它相关的一组寄存器,如c1,c2,等。

在描述映射细节之前,我们先讲清楚MMU的映射方法,如何把4G的物理内存映射到1G的实际物理内存上,再有操作系统的条件下,系统会再映射之前先去找没有映射过的物理内存,找到之后再做映射,而再裸板的条件下,需要人为的避免重复映射。MMU采用段映射,比如说可以给4G空间划分成4096个1M的段,如果采用一级页表映射,则就是1M的映射,只需要在内存中找到某个1M物理内存的首地址就能完成映射,大部分情况下一个程序并不需要1M的物理内存来运行,这样就会造成内存的浪费使用,解决办法就是采用二级页表,二级页表也采用段映射的方式,把1M的空间划分为256个段,再这种情况下一级页表指定属于物理内存那1M ,二级页表在之前指定的1M空间里的那4K。


比如要把这个虚拟地址0xc2312678    映射到    0x53432678  (注意后三位必须相同才会映射成功,很显然这样才能做得到4K对齐)


可以进行映射了。下面讲解 一下映射细节,比如说要设置那些寄存器。

1. memset(ttb, 0, 4 * 4096);
   ttb[0xc23] = ((int)ttb_1)|0x1;   //完成一级映射,| 0x1,表明使用二级页表


    memset(ttb_1, 0, 4 * 256);
    ttb_1[0x12] = (0x53432<<12)|0x2; //完成二级映射,二级页表项直接指向物理地址,| 0x2,表明二级页表指向4K的 物理内存

   很明显虚拟地址的前12位决定一级页表的查询位置,虚拟地址的后续的8位决定二级页表的查询地址。

2. 本地完成映射以后,需要把做好的映射关系设置到tlb:"mcr p15, 0, %1, c2, c0, 0\n\t"  其中%1,代表做好映射的首地址


3.在完成映射之后要使能MMU,可以通过如下操作:

                                      "mcr p15, 0, r0, c8, c7, 0\n\t"//invalidate all the unlocked entries in the Unified(清除TLB条目)

                                        "mcr p15, 0, %0, c3, c0, 0\n\t"//Write Domain Access Control Register (设置映射地址访问权限,%0代表一个32进制数)

                                        "mcr p15, 0, %1, c2, c0, 0\n\t"//Write Translation Table Base Register 0 (设置映射关系,%1,代表一个已经做好映射关系的ttb地址

                                         //enable_mmu
                                      "mrc p15, 0, r0, c1, c0, 0\n\t"
                                       "orr r0, r0, #1\n\t"
                                      "mcr p15, 0, r0, c1, c0, 0\n\t"

这就可以在程序中使用做了映射的虚拟地址了。

附CSDN的一篇相关文章的地址:http://www.embedu.org/Column/Column583.htm

你可能感兴趣的:(ARMv6 架构下MMU虚拟地址到物理地址二级映射过程)