如何开启MMU
编写裸机程序时,网上查到UBOOT开启了MMU,我在程序中关闭了MMU后程序仍可继续正确运行。但当我设置好页表,各种控制寄存器后,再开启MMU,程序就不对了,不知该如何是好, 是否有自己开启过MMU的大侠,希望能不吝赐教,此事我折腾好些日子了,没有什么进展。希望有高人指点一二,在此先谢过了!本帖最后由 dragonnk 于 2014-5-18 10:31 编辑
今天试验了一下,外设0x70000000~0x7FFFFFFF的空间也要记录在页表的转换表内,当然转换的虚拟地址和物理地址是一样的,程序可以正常运行。但是不能开数据cache开了程序又不对了,正在学习中......
给出我的程序,供大家参考:
void MMU_start() {
asm(
//关闭数据缓存MMU_DisableDCache
" mrc p15,0,r0,c1,c0,0 \n"
"bic r0,r0,#(1<<2) \n"
"mcr p15,0,r0,c1,c0,0 \n"
//关闭指令缓存MMU_DisableICache
"mrc p15,0,r0,c1,c0,0 \n"
"bic r0,r0,#(1<<12) \n"
"mcr p15,0,r0,c1,c0,0 \n"
//关闭MMU MMU_DisableMMU
"mrc p15,0,r0,c1,c0,0 \n"
"bic r0,r0,#1 \n"
"mcr p15,0,r0,c1,c0,0 \n"
//无效TLB,无效指令和数据缓存
"MOV r0,#0\n"
"mcr p15,0,r0,c8,c7,0 \n"
"mcr p15,0,r0,c7,c7,0 \n"
"ldr r0,=0x7\n" //TTB控制寄存器N=7
"MCR p15,0,r0,c2,c0,2\n"
"ldr R0,=0x55555555\n"
"MCR p15,0,R0,c3,c0,0\n"//设置区域访问属性为客户模式
"ldr r0,=0x52000000\n" //TTB0,TTB1都为0x52000000
"MCR p15,0,r0,c2,c0,0\n" //TTB0地址记录页表项地址可映射到自己想到的地方,页表项后16位为0x1C02
"MCR p15,0,r0,c2,c0,1\n" //TTB1地址记录的页表项地址从0x50000000~0x80000000虚拟和物理地址相同
"MRC p15,0,r0,c1,c0,0\n"//使用armv6页表。中断向量地址由VIC决定(此项不设也可以)
"ldr r1,=0x1800000\n"
"orr r0,r0,r1\n"
"MCR p15,0,r0,c1,c0,0\n"
//开启MMU,没有开Dcache
" mrc p15,0,r0,c1,c0,0\n"
"ldr r2,=0x1\n"
"orr r0,r0,r2\n"
"mcr p15,0,r0,c1,c0,0\n"
);
}
以上程序仅供参考不一定完全正确。
不好意思又来补充发贴了,通过试验我发现把堆栈区在页表里设为不可缓存,同时开启数据和指令缓存就没问题了,不知是不是这个原因。
页:
[1]