u-boot_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  7  6  5  4  3  2  1  0

段基地址                    应为0                          AP   0              d  1  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.............   






Fill the data into the mmu_table
     
     code in hal_platform_extras.h
     Notes: In this code, the physical address for every access is equle to its virtual address,This is known as a "flat address mapping".

    code explains:

    // 64MB SDRAM
    .set    __base,0x000       ;; set a symbol __base as value 0
    .rept    0x040 - 0x000    ;; repeat the next data (FL_SECTION_ENTRY __base,0,3,0,0,1,0) from 0x000 to 0x040
    FL_SECTION_ENTRY __base,0,3,0,0,1,0  ;; this is 32bit value as "First Level descriptor format"
    .set    __base,__base+1     ;; __base++ until 0x40
    .endr

    // 192MB Unused
  .rept   0x100 - 0x080
  .word 0
  .set    __base,__base+1
  .endr

    So this code fill 0x40*32bit (0x100Byte) mmu_table buffer.
    Every entry mapping/translate 1Mbyte memory.

  // form a first-level section entry
  .macro FL_SECTION_ENTRY base,x,ap,p,d,c,b
  .word (\base << 20) | (\x << 12) | (\ap << 10) | (\p << 9) |\
        (\d << 5) | (\c << 3) | (\b << 2) | 2
  .endm
   
    base: section base address
    x:    not used
    ap:   access permission, 3 -- Read/Write
    p:    not used
    d:    Domain   0 -- No access
    c:    Cachable    1 -- enable  0 -- disable
    b:    Bufferable  1 -- enable  0 -- disable
    Bit[1:0]: Identify the type of descriptor    2 -- section descriptor
发布了8 篇原创文章 · 获赞 4 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览