dragonnk 发表于 2014-5-16 20:35:39

如何开启MMU

      编写裸机程序时,网上查到UBOOT开启了MMU,我在程序中关闭了MMU后程序仍可继续正确运行。但当我设置好页表,各种控制寄存器后,再开启MMU,程序就不对了,不知该如何是好, 是否有自己开启过MMU的大侠,希望能不吝赐教,此事我折腾好些日子了,没有什么进展。希望有高人指点一二,在此先谢过了!

dragonnk 发表于 2014-5-17 20:34:39

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


dragonnk 发表于 2014-5-19 20:50:50

   不好意思又来补充发贴了,通过试验我发现把堆栈区在页表里设为不可缓存,同时开启数据和指令缓存就没问题了,不知是不是这个原因。
页: [1]
查看完整版本: 如何开启MMU