• Tiny6410之MMU开启


    存储管理单元存储管理单元MMU概述
      在ARM系统中,存储管理单元MMU主要完成以下工作:
    1、虚拟存储空间到物理存储空间的映射。在ARM中采用页式虚拟存储管理。他把虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种。MMU要实现虚拟地址到物理地址的转换。
    2、存储访问权限的控制
    3、设置虚拟存储空间的缓冲特性

    MMU的操作步骤
    1、使无效cachen/TLB
      在S3C6410中 CP15中的寄存器C7用于控制cache和写缓冲区,他是一个只写的寄存器。使用MRC指令读取该寄存器,将产生不可预知的结果。使用MCR指令写该寄存器,具体操作格式如下:
        MCR p15, 0, <Rd>, <c7>, <CRm>, <opcode_2>
    其中 CRm = c7 ,opcode_2 = 0 表示使无效整个cache(Icachen和Dcachen),
    其中 CRm = c10 ,opcode_2 = 4 表示清空写缓冲区
        
    2、将页表地址告诉MMU
    页表存放在内存中,系统通常有一个寄存器来保存页表的基地址,在ARM中系统控制协处理器CP15的寄存器c2用来保存页表的基地址。具体操作格式如下
        MCR p15, 0, <Rd>, <c2>, <CRm>, <opcode_2>
        其中 CRm = c0 ,opcode_2 = 0 表示写入基地址


    3、设置域
      MMU可以将整个存储空间分为最多16个域。每个域对应一定的内存区域,该区域具有相同的访问控制属性。MMU中寄存器C3用于控制与该域相关的属性配置


    4、使能cache
      和cache和写缓冲操作相关的寄存器包括CP15中的寄存器C7、寄存器C9以寄存器C1中的某些位寄存器c1中与cache和写缓冲区操作相关的为有C(bit[2]),W(bit[3]),I(bit[12]),和RR(bit[14])其中 CRm = c7 ,opcode_2 = 0 表示使无效整个cache(Icachen和Dcachen).


    5、使能MMU
      CP15的寄存器C1的位[0]用于控制禁止/使能MMU。当CP15的寄存器C1的位[0]设置成0时,禁止MMU;当CP15的寄存器C1的位[0]设置成1时,使能MMU;C(bit[2]) 当数据cache和指令cache是分开的时候,本控制禁止/使能数据cache;当数据cache和指令cache是统一的时候该控制位禁止/使能整个cache
      0  禁止cache
      1  使能cache
     W(bit[3]) 禁止/使能写入缓冲
      0 禁止写入缓冲
      1 使能写入缓冲
     I(bit[12]) 当数据cache和指令cache是分开的时候,本控制禁止/使能指令cache;
      0  禁止cache
      1  使能cache

      RR(bit[14]) 如果系统中的淘汰算法可以选择的话,本控制位选择淘汰算法
      0 选择常规的淘汰算法
      1 选择预测性的淘汰算法

     //将页表地址告诉MMU,启动MMU
     .global mmu_enable
     mmu_enable:
         //使无效cache/TLB 
          mov r1, #0
          mcr p15, 0, r1, c7, c7, 0     //使无效ICache、DCache
          mcr p15, 0, r1, c7, c10, 0    //使无效写缓冲
          mcr p15, 0, r1, c8, c7, 0     //使无效指令、数据TLB
         
         //将页表地址告诉MMU
         mcr p15, 0, r0, c2, c0, 0     //写入页表地址,r0位页表基地址
         
         //设置域
         mrc p15, 0, r1, c3, c0, 0     //获取控制寄存器的值
         orr r1, r1, #3
         mcr p15, 0, r1, c3, c0, 0
         
         //使能ICache、DCache
         mcr p15, 0, r1, c1, c0, 0     //读取控制寄存器的值
      
         orr r1,r1, #(1<<2)
         orr r1,r1, #(1<<12)
         orr r1,r1, #(1<<14)
         mcr    p15, 0, r1, c1, c0, 0  //写入控制寄存器
         
         //使能MMU
         orr r1,r1,#(1<<0)
         mcr p15,0,r1,c1,c0,0
         //返回
         mov pc lr
    MMU.S
    海阔凭鱼跃,天高任鸟飞。
  • 相关阅读:
    【Android Developers Training】 73. 布局变化的动画
    【Android Developers Training】 72. 缩放一个视图
    【Android Developers Training】 71. 显示翻牌动画
    svn更改地址怎么办
    python学习手册
    failed to bind pixmap to texture
    Ubuntu 12.04安装Google Chrome
    svn update 时总是提示 Password for '默认密钥' GNOME keyring: 输入密码
    重设SVN 的GNOME keyring [(null)] 的密码
    Nginx + uWSGI + web.py 搭建示例
  • 原文地址:https://www.cnblogs.com/chenshikun/p/6009275.html
Copyright © 2020-2023  润新知