本帖最后由 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"
);
}
以上程序仅供参考不一定完全正确。
|