为什么将“0x50C06”填入 1 级页面 table 条目?

Why fill “0x50C06” to level 1 page table entry?

为什么在下面的代码中用值 0x50C06 填充 table 条目?

    TTB_ENTRY_SUPERSEC_DEV  DEFINE   0x50C06 
                                           ; Setup page table.
    LDR     r0,=SFE(MMU_TT)                     ; Load page table base address


                                                ; Init the whole page table as dev memory by default
    MOV     r4, #0x00000000
    MOV     r3, r0
    ADD     r3, r3, #0x0

TTbl_Dev_Loop1
    MOV32   r1, #TTB_ENTRY_SUPERSEC_DEV
    ADD     r1, r1, r4
    MOV     r5, #16
TTbl_Dev_Loop2
    STR     r1, [r3], #4
    SUBS    r5, r5, #1
    BNE     TTbl_Dev_Loop2
    ADD     r4, r4, #0x1000000
    CMP     r4, #0x0
    BNE     TTbl_Dev_Loop1

first level ARM page table 部分 超级部分

Bits    |31   24|  20|19|18|17|16| 15|14 12|11 10|9|8    5| 4|3|2|1|0
--------+------------+--+--+--+--+---+-----+-----+-+------+--+-+-+-+-
Section |Base address|NS| 0|nG| s|APX|  TEX|   AP|P|Domain|XN|C|B|1|0
Super   |Base   | SBZ|NS| 1|nG| s|APX|  TEX|   AP|P|Ignore|XN|C|B|1|0
0x50C06 |            | 0| 1| 0| 1|0  |  000|   11|0|  0000| 0|0|1|1|0
is super|            |  | *|...

这些允许一次映射 16MB 的大部分内存。每个一级 table 条目代表 1MB 地址 space。超级部分重复此 16 次,总共 16MB。这是代码,

    MOV     r5, #16         ; 16 entries.
TTbl_Dev_Loop2
    STR     r1, [r3], #4    ; write entry
    SUBS    r5, r5, #1      ; decrement and test for zero.
    BNE     TTbl_Dev_Loop2  ; branch if more needed.

其余代码只是用 r4 寄存器更改基数。 ADD r4, r4, #0x1000000 通过地址 space 步进 16MB。因此,这会将所有虚拟地址映射到物理地址。这通常在引导系统期间使用,当 MMU 首次打开并且可以启用缓存时。典型设备没有 4GB 的实际物理内存(和外围设备),因此可以通过更新 table 重新使用未使用的物理地址。也可以 change the super sections to have page table entries (l2 page tables with ) 因为系统是 运行.

似乎所有内存都设置为设备内存(至少启动),因此不会使用任何类型的缓存。其中一些其他位(AP、TEX 等)取决于未显示的 CP15 寄存器值。

另请参阅:
Change TTB_BASE
ARM Paging