ARM S5PC110 MMU 访问地址的问题
hi 大侠们:
想要问个关于MMU的问题。
我手上的开发板是QT210的。现在在uboot中输入以下命令:
(1):
nand read 30A00000 B00000 180000
md 30A00000 10
(2):
nand read C0A00000 B00000 180000
md C0A00000 10
以上两组命令后现实的内容完全一样。唯一不一样的地方是nand读取后存放地址。(1)中是30A00000而(2)中是C0A00000。
看了lowlevel_init.S中关于mmu的设置(uboot中使用了MMU),打开使能MMU。而且映射的地址关系是这样的:
/*
* MMU Table for SMDKC110
* 0x0000_0000 -- 0xBFFF_FFFF => Not Allowed
* 0xB000_0000 -- 0xB7FF_FFFF => A:0xB000_0000 -- 0xB7FF_FFFF
* 0xC000_0000 -- 0xC7FF_FFFF => A:0x3000_0000 -- 0x37FF_FFFF
* 0xC800_0000 -- 0xDFFF_FFFF => Not Allowed
* 0xE000_0000 -- 0xFFFF_FFFF => A:0xE000_0000 -- 0XFFFF_FFFF
*/
我的问题是这样的:
虚拟转实际过程中我们使用的是减掉偏移。如果是不相同的两个地址为什么会导致读取的内容是一样的?
硬件的sdram的映射地址位30000000 ~ 4FFFFFFF(256MBx2)
假如输入的地址是C0A00000 那么最后作用在物理地址上的就是30A00000。如上图中红色的映射关系所示。
但是如果是30A00000,那么这个地址将会如何被MMU所识别?也是减去一个便宜量?或者说在uboot的代码中。MMU的设置是双向的?
vir《=》phy 是相等的?
不知到我的理解对吗,大侠不要吝啬自己的文笔和知识,请多给点意见。
谢谢
[解决办法]
VA到PA不是简简单单的偏移那么简单。PA=tabMap[VA>>20]+VA&0xfffff
就是说将虚拟地址的高12位取出来,作为指针数组的下标,该下标对应的元素是一个内存地址,把这个地址
作为一段地址的基指,再加上低20位偏移地址。
根据这个0x0000_0000 -- 0xBFFF_FFFF => Not Allowed
也许你的页表中没有指定页表基址,mmu根本找不到VA到PA的映射关系,也许没有使用mmu就直接处理了。
[解决办法]
MMU都是通过映射表来实现的。可以分成几级映射,就有几个层次的表。表的基地址写在mmu寄存器里,一个虚地址来了,高10位找到相应的一级表,后面n位找到二级表,最后结合最后偏移量得到物理地址。。。。
这些都是标准的统一的。
如果说一段地址不让访问没有映射,其实是可以将其对应的表项属性进行设置,每个表都有属性标志,比如可读写缓存。。。
如果禁止读写,就不能访问了,虽然表项存在。