• uboot_smdkv210 分析八:MMU地址映射


    ARM的MMU由CP15协处理器管理。

    一. 与MMU管理有关的寄存器有:

    C1:某些位 用于配置MMU中的一些操作
    C2:页表基地址,有效的为[31:14],所以页表地址必须16KB对齐。
    C3:域(domain)的访问控制属性
    C4:保留
    C5:内存访问失效状态指示
    C6:内存访问失效时失效的地址
    C8:控制和清除TLB内容相关的操作
    C10:控制和锁定TLB内容相关的操作

    二. 禁止/使能MMU

    C1的0位控制禁止/使能MMU:
    MRC P15,0,R0,C1,0,0
    ORR R0,#01
    MCR P15,0,R0,C1,0,0

    三. 段描述符

    31                      20  19                        12  11  10  9  8        5  4  3  2  1  0

    段基地址                    应为0                          AP   0   域                  C  B  1  0

    上述是一个以Section方式定义的段描述符:
    一个Section为1M,虚拟地址到物理地址的映射实际是高12位地址的置换。
    C2的18位基地址作为索引表的高18位,虚拟地址的高12位作为索引表的低12位,共同构成低两位为0的字对齐索引表地址。
    查到的表内容就是这个段描述符,这个描述符里面的段基地址就是要被替换的虚拟地址高12位。
    这个描述符还控制了这1M空间的读写、域、cache和buffer属性。

    四. 汇编建表准备

    .macro FL_SECTION_ENTRY base,ap,d,c,b
        .word (\base << 20) | (\ap << 10) | (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
    .endm
    .section .mmudata, "a"
        .align 14
        .globl mmu_table

    宏FL_SECTION_ENTRY根据控制参数建立一个字大小的描述符。
    .align 为保证16KB地址对齐。

    五. 汇编建表

        .set __base,0x200
        // 256MB for SDRAM with cacheable
        .rept 0xD00 - 0xC00
        FL_SECTION_ENTRY __base,3,0,1,1
        .set __base,__base+1
        .endr

    __base为这部分代码建表物理地址的基地址。
    rept控制建描述符数量,用0xD00-0xC00为了从虚拟地址的0开始连续的建表,增强可读性。
    调用宏创建描述符。
    __base每循环一次加一。

    六. 实例

    下面查看内存发现0xC0000000的确映射到0x20000000了。
    SMDKV210 # md 20000000 20                                                       
    20000000: 12345678 bdbcd51e bd6ff697 bf71f6ff    xV4.......o...q.               
    20000010: fadcdf3f 7b4fe79f 9eb4cfff 8badefd7    ?.....O{........               
    20000020: 8fa7ebdf d7afdf7d 6bacf5bf dbb5dbd6    ....}......k....               
    20000030: ca39fdbf cba7cfd3 fff5f6bf 2b9553fd    ..9..........S.+               
    20000040: df2dce57 ffa1601f cb478f55 8fa7cfff    W.-..`..U.G.....               
    20000050: bb81c74f 9bb0f4df b7abd2d3 eba5fe37    O...........7...               
    20000060: 9fafffdf df67f7be eea5b6bf bae5cd5b    ......g.....[...               
    20000070: fb55ffd6 9be5d8ff c9b5fdfe 83afc09f    ..U.............               
    SMDKV210 # md c0000000 20                                                       
    c0000000: 12345678 bdbcd51e bd6ff697 bf71f6ff    xV4.......o...q.               
    c0000010: fadcdf3f 7b4fe79f 9eb4cfff 8badefd7    ?.....O{........               
    c0000020: 8fa7ebdf d7afdf7d 6bacf5bf dbb5dbd6    ....}......k....               
    c0000030: ca39fdbf cba7cfd3 fff5f6bf 2b9553fd    ..9..........S.+               
    c0000040: df2dce57 ffa1601f cb478f55 8fa7cfff    W.-..`..U.G.....               
    c0000050: bb81c74f 9bb0f4df b7abd2d3 eba5fe37    O...........7...               
    c0000060: 9fafffdf df67f7be eea5b6bf bae5cd5b    ......g.....[...               
    c0000070: fb55ffd6 9be5d8ff c9b5fdfe 83afc09f    ..U.............  

  • 相关阅读:
    eclipse中用maven打包报错排查
    关于如何下载spring tool Suite指定版本的安装包
    win10配置JDK和tomecat
    C#读取MySql时,如果存在字段类型为date/datetime时的可能会出现以下问题
    批处理安装,卸载,启动,停止服务
    微信小程序图表组件 wx-f2
    获取项目路径
    Global.asax.cs之在线人数统计
    Global.asax 文件之 Application_Error
    Global.asax 文件是什么
  • 原文地址:https://www.cnblogs.com/Efronc/p/2531655.html
Copyright © 2020-2023  润新知