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"

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

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

ARMv5架构的处理器上实现虚拟内存管理,关键在于正确配置和使用MMU(内存管理单元)。MMU允许操作系统管理虚拟地址空间,并将其映射到物理内存地址,同时提供内存保护机制。要编程实现这一功能,开发者需要深入了解ARMv5架构的技术手册和用户指南。 参考资源链接:[ARMv5架构参考手册:用户指南](https://wenku.youkuaiyun.com/doc/58w2redayc?spm=1055.2569.3001.10343) 首先,开发者需要理解ARMv5处理器中的MMU是如何工作的,包括它如何处理地址转换和内存访问权限。ARMv5架构MMU支持固定大小的页表,每个表项可以定义一个虚拟页到物理页的映射,以及相关的访问权限和缓存策略。 在编程时,开发者通常需要执行以下几个步骤: 1. 初始化页表:在内存中创建页表,并填入正确的映射信息。每个页表项应包含物理页地址、访问权限和缓存属性。 2. 配置控制寄存器:设置CP15协处理器的控制寄存器,用于控制MMU的工作方式,包括开启或关闭MMU,设置缓存和写缓冲区的策略。 3. 使能MMU:在所有必要的配置完成后,通过写入CP15寄存器的相应位来使能MMU。一旦MMU开启,处理器将开始使用虚拟地址,并且通过页表来访问物理内存。 编程实现虚拟内存管理时,开发者需要关注以下几个要点: - 页面大小和对齐:ARMv5通常支持几种固定的页面大小,如1KB、4KB、64KB等。开发者需要根据系统需求选择合适的页面大小。 - 页表层级:ARMv5通常使用二级页表结构,开发者需要创建和维护页表页和页目录页。 - 缺页异常:如果虚拟地址对应的物理页面不存在,MMU将触发缺页异常。开发者需要编写异常处理程序来处理这种情况,可能需要从存储中加载页面。 - 权限控制:开发者可以利用MMU对内存访问进行细粒度的权限控制,包括只读、只执行等。 为了更好地理解和应用这些概念,强烈推荐阅读《ARMv5架构参考手册:用户指南》。手册详细描述了ARMv5架构的内存管理技术细节,包括MMU的配置和使用。这份资料不仅帮助开发者理解理论,还提供实际的编程指导和案例,是掌握ARMv5处理器编程的重要工具。 参考资源链接:[ARMv5架构参考手册:用户指南](https://wenku.youkuaiyun.com/doc/58w2redayc?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值