arm MMU原理

虚拟存储器使得程序并发执行得以实现,并且可以让大程序在较小的内存中也能运行,因为在程序本身看来他们似乎拥有了可寻址长度大小的内存,比如你是32位的地址线位宽存,但是你只有1G的内存条,使用虚拟地址映射就能让程序看到4G的空间,即使是虚的,虚拟存储的原理就是将虚拟地址映射到物理地址,映射的方法有两种,一种是通过公式计算,另一种就是建立一张地址映射表。记得有人说过,计算机的所有问题都可以用一个中间件来解决,这里用的就是后者,MMU其实也就是建立了一些地址映射表来实现虚拟到物理地址的转换的。

上图就是MMU的结构,它位于ARM处理器和内存之间,cpu将虚拟地址发给TLB(Translation Lookaside Buffer)转换检测缓冲区,实际上就是一个cache,它里面会存一些虚拟到物理地址的映射,一般是最近用到的,虚拟地址来时,先查它里面有没有,如果有的话就叫命中,直接得到对应的物理地址,所以它也俗称快表。如果没有它的话,每次寻址都要两次访问内存(第一次查物理地址,第二次访问对应的物理地址)。没命中的话就需要老老实实 去页表中找了,首先通过TTB(translation table base   一级页表的基地址,它被放入了协处理器CP15的C2寄存器里)找到对应的页表(段表),在继续根据相应的位规定的方式去找表项来找到物理地址。(这里貌似听说有二级三级缓存,也不大清楚,先弄清原理以后再改)。
arm处理器中的MMU有两级页表,其中以段的方式进行转换只用到了一级页表(段表),以页的方式进行转换就需要用到两级页表。 
找不到图啊。。。。只有截一张别人博客的图了。


  看这张图的时候一定要细心,其中的哪一位是什么作用,哪一段在什么时候被用来做什么,都是有讲究的,做这个图的也很专业。
TTB中放置了4096个表项,这些表项里面存放的是下一级页表或段表的一段基址如果用的是段的方式寻址的话,那么这一级出来直接就找到了对应的1M大小的物理段,再加上偏移量就是物理地址了。如果是用页寻址的话里面还包括比较多种情况,首先得选择下一级的页表是粗页还是细页,粗页的下一级可以用64K或者4K大小的页粒度来寻址,细页的下一级可以用64K、4K、1K 寻址。 这里就注意到了一个问题,它是通过什么来选择用什么方式寻址呢。

可以在TTB那里看到最低两位不同,实际上也就是根据这两位来区别选用什么方式找下一级的,上图是一级寻址时的描述符,00 代表无效地址,01 是粗页表, 10 是段寻址, 11 是细页表。
对于页寻址来说,找到一级页表还不够,还得继续找下一级,显然最低两位的描述符也应该随之改变。这里不列出了,原理就是这样。

这是段寻址的流程,首先cpu发出MVA(modifyed virtual address) 然后根据寄存器找到TTB的基址,然后用TTB的基址加上MVA 的高12位得到对应的段描述符,最低两位是 00,(因为找段描述符也是找一个地址,地址是32位,所以这个地址应是4B对齐)。找到段描述符后,取出段描述符里的前面12位为段基址(1M空间 20位对齐 ),再加上最开始传过来的MVA的后面20位就得到PA。(段描述符后两位变成了 标识本次是段寻址的 10)。


页寻址的原理其实都差不多,只不过粒度不一样,这样以细页举例。
注意MVA被分成了3段,所以也就是二级页表了,都是一级一级传下来最后找到物理地址。首先MVA传出,根据TTB基址寄存器找到TTB基址,加上MVA的高12位索引找到一级描述符的地址,然后看里面的最低2位,发现是细页寻址 11,便知道了应该用里面的高20位作为下一级描述符的基址,然后加上MVA里面的二级页表索引([19:10] 位共10位) 去找二级页表(也是4B对齐),找到之后再看里面的内容低2位,发现是小页寻址,于是便用高22位和MVA里的最后10位寻址,这里页的粒度是1K(10bit)。
其他不同粒度页大同小异,一级一级找下来,根据最低2位来分别描述符里的内容


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值