Chinaunix首页 | 论坛 | 博客
  • 博客访问: 605918
  • 博文数量: 99
  • 博客积分: 5128
  • 博客等级: 大校
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-27 19:40
文章分类

全部博文(99)

文章存档

2012年(3)

2011年(5)

2010年(4)

2009年(31)

2008年(56)

分类:

2008-12-30 13:08:44

MMU的原理其实不难,不过确实有点玄,所以估计很多人会看的一头雾水吧。其实定心来分析这些东西的原理,容易找到规律。

先从最简单的一级页表的段描述符开始分析,

段描述符的是描述 1M 地址块的,颗粒比较大。ARM可以访问4G空间,那么很容易计算出,我们需要 4096*1M = 4G 个地址块,也就需要 40961级描述符的原因了,每个描述符占4个字节,也就是我们需要 4*4096 = 16K 字节的额外内存空间来保存这个页表。刚好对应着这页表的地址必须是 16K 对齐的。也就是 bit0~bit13必须为0

 

这页表就相当于一本书的目录,例如我需要找一本书里面的一个章节,那么正常的思维应该是:现找到这本书的目录所在,假如第4页是目录开始,有2页纸都是这书的目录,那么我们从第四页开始找我们需要的章节的地址,例如我们第十二章在504页,OK,那么很自然的我们翻开 504页,那么我们需要查找 12章的最终目的达到了。

 

其实,说白了,这MMU的本质跟这个是一模一样。我们来对比一下。

CPU发出指令要求访问某个地址,就好像我们要找第十二章书。CPU发出了指令了,后面就不管了,那么我们的角色就在扮演着MMU的查找任务。

VA先转换为MVA,这个才是MMU认识的虚拟地址。也就是MMU的任务就是找出这个虚拟地址对应的物理地址。

跟查书一样,我们需要知道目录的地址,MMU也一样,先从P15协处理器的C2那里,读出先前保存好的页表地址,根据这个地址找到页表,就好像我们根据地址找到书的目录。

然后第二步就是根据目录找第12章的地址,MMU在页表那里,配合MVA的地址,查找出地址对应的地址块属于4096个页表项里面的哪一个。这个页表项里面保存着真正的物理地址,那么就好像我们在目录里面找到第十二章,那里写这章书的具体的地址,最后一步,很简单,我们翻开这个地址就能找到内容,MMU的话是将这个物理地址送到系统总线,那么具体的数据就能出现在数据总线上面,那么CPU就知道这个地址的具体内容。

这就是基本原理。

 

下面分析一下一些细节方面的问题,还有一些本质问题。

1,  页表的基地址寄存器,也就是P15C2必须是16K对齐的,前面也说了,至于为啥一定要16K对齐?这个貌似有点难理解了,但是有个很巧合的情况就是,这个页表的总大小就是16K!!

2,  反正根据C2找到具体的页表入口地址就是了。既然知道入口地址,又知道里面一共有4096个项目,那么很自然的可以想到该怎么样去处理了。而这低14位应该对应着4096个项目,也就是40961MB的地址块共4G地址。但是2^12 就能表示4096了。这里刚好每个描述符占4个字节,也就是要求4字节对齐的,这样合起来一共就占用了14位,其中最低两位为0,这样就得出一个完整的索引地址了。

3,  从查出来的页表描述符的 bit20~31就是我们需要的物理地址了。然后和MVAbit0~19结合,刚好就得到一个完整的物理地址。

4,  可以看出,总体的思想就是映射1MB的块,然后其他就根据索引就OK

 

所以做页表描述符的步骤:

1,  确定页表的基地址,注意必须是16K对齐的,并且将这个地址送到P15C2寄存器。

2,  4096个页表项,可以和实际地址一一对应,也可以按照自己的意愿修改映射地址。

3,  MMU_TABLE + VA >>20 实际上就是在页表里面所以一个1M的块,块的内容就是实际的物理地址加上访问属性。PA&0XFFF00000 | PARAM,最后就是将这个内容送到刚才所以出来的地址,这样就生成一个页表项,用同样的办法,一共做4096的项就完成了。

 

到此,终于形象的理解了最简单的MMU功能,也就是基于段表的MMU,颗粒大。至于二级页表等,原理差不多,只是更加复杂了,linux内核已经做好了这部分的代码,所以我们不需要关心这方面的内容。

阅读(1696) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2009-07-20 10:42:01

通俗易懂!谢谢!