分类:
2008-12-30 13:08:44
MMU的原理其实不难,不过确实有点玄,所以估计很多人会看的一头雾水吧。其实定心来分析这些东西的原理,容易找到规律。
先从最简单的一级页表的段描述符开始分析,
段描述符的是描述
这页表就相当于一本书的目录,例如我需要找一本书里面的一个章节,那么正常的思维应该是:现找到这本书的目录所在,假如第4页是目录开始,有2页纸都是这书的目录,那么我们从第四页开始找我们需要的章节的地址,例如我们第十二章在504页,OK,那么很自然的我们翻开 504页,那么我们需要查找 12章的最终目的达到了。
其实,说白了,这MMU的本质跟这个是一模一样。我们来对比一下。
CPU发出指令要求访问某个地址,就好像我们要找第十二章书。CPU发出了指令了,后面就不管了,那么我们的角色就在扮演着MMU的查找任务。
VA先转换为MVA,这个才是MMU认识的虚拟地址。也就是MMU的任务就是找出这个虚拟地址对应的物理地址。
跟查书一样,我们需要知道目录的地址,MMU也一样,先从P15协处理器的C2那里,读出先前保存好的页表地址,根据这个地址找到页表,就好像我们根据地址找到书的目录。
然后第二步就是根据目录找第12章的地址,MMU在页表那里,配合MVA的地址,查找出地址对应的地址块属于4096个页表项里面的哪一个。这个页表项里面保存着真正的物理地址,那么就好像我们在目录里面找到第十二章,那里写这章书的具体的地址,最后一步,很简单,我们翻开这个地址就能找到内容,MMU的话是将这个物理地址送到系统总线,那么具体的数据就能出现在数据总线上面,那么CPU就知道这个地址的具体内容。
这就是基本原理。
下面分析一下一些细节方面的问题,还有一些本质问题。
1, 页表的基地址寄存器,也就是P15的C2必须是16K对齐的,前面也说了,至于为啥一定要16K对齐?这个貌似有点难理解了,但是有个很巧合的情况就是,这个页表的总大小就是16K!!
2, 反正根据C2找到具体的页表入口地址就是了。既然知道入口地址,又知道里面一共有4096个项目,那么很自然的可以想到该怎么样去处理了。而这低14位应该对应着4096个项目,也就是4096个1MB的地址块共
3, 从查出来的页表描述符的 bit20~31就是我们需要的物理地址了。然后和MVA的bit0~19结合,刚好就得到一个完整的物理地址。
4, 可以看出,总体的思想就是映射1MB的块,然后其他就根据索引就OK。
所以做页表描述符的步骤:
1, 确定页表的基地址,注意必须是16K对齐的,并且将这个地址送到P15的C2寄存器。
2, 做4096个页表项,可以和实际地址一一对应,也可以按照自己的意愿修改映射地址。
3, MMU_TABLE + VA >>20 实际上就是在页表里面所以一个
到此,终于形象的理解了最简单的MMU功能,也就是基于段表的MMU,颗粒大。至于二级页表等,原理差不多,只是更加复杂了,linux内核已经做好了这部分的代码,所以我们不需要关心这方面的内容。