为什么将“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
为什么在下面的代码中用值 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