嵌入式爱好者

查看: 3703|回复: 2

[裸机程序] 如何开启MMU

[复制链接]

7

主题

15

帖子

28

积分

扫一扫,手机访问本帖
发表于 2014-5-16 20:35:39 | 显示全部楼层 |阅读模式
      编写裸机程序时,网上查到UBOOT开启了MMU,我在程序中关闭了MMU后程序仍可继续正确运行。但当我设置好页表,各种控制寄存器后,再开启MMU,程序就不对了,不知该如何是好, 是否有自己开启过MMU的大侠,希望能不吝赐教,此事我折腾好些日子了,没有什么进展。希望有高人指点一二,在此先谢过了!
回复

使用道具 举报

7

主题

15

帖子

28

积分

 楼主| 发表于 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"
            );
}
             以上程序仅供参考不一定完全正确。

  
点评回复 支持 反对

使用道具 举报

7

主题

15

帖子

28

积分

 楼主| 发表于 2014-5-19 20:50:50 | 显示全部楼层
     不好意思又来补充发贴了,通过试验我发现把堆栈区在页表里设为不可缓存,同时开启数据和指令缓存就没问题了,不知是不是这个原因。
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-6-3 02:28

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表