mini2440硬件篇之MMU

         MMU是内存管理单元,负责虚拟地址到物理地址的映射和内存访问权限检查。本文只讲地址映射,地址映射长度有段1MB、大页64KB、小页4KB、极小页1KB,本文只讲段1MB的情况,其它类似。我们每个进程的空间都是4G,不同的进程的变量地址有可能一样,这就是虚拟地址,其实它们对应到物理地址是不一样的。这种虚拟地址到物理地址的转换就是MMU做的事。所以开启MMU之后,cpu发出的地址就是虚拟地址,关闭MMU,cpu发出的地址就是物理地址,关闭MMU的时刻,一般是boot阶段。

         首先要建立一张映射表,按1M映射的话,4G共有4096个1M的段,每个需要4字节存储映射的地址,所以映射表的大小是4096*4字节(即16k),映射表的地址放在内存起始地址0x30000000。比如要把GPB的寄存器0x56000000映射到0xA0000000,0xA000000/1M=2560,所以在映射表的2560*4地址,存放0x56000000。然后把表格的首地址,即0x30000000告诉MMU,启动MMU即可。后面操作虚拟地址0xA0000000就是操作物理地址0x56000000。

     unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;
    /*
     * 0x56000000是GPIO寄存器的起始物理地址,
     * GPBCON和GPBDAT这两个寄存器的物理地址0x56000010、0x56000014,
     * 为了在第二部分程序中能以地址0xA0000010、0xA0000014来操作GPBCON、GPBDAT,
     * 把从0xA0000000开始的1M虚拟地址空间映射到从0x56000000开始的1M物理地址空间
     */
    virtuladdr = 0xA0000000;
    physicaladdr = 0x56000000;
    *(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
                                            MMU_SECDESC;
启动MMU的代码需要使用协处理器,需要了解arm核,暂不深入研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值