我在试着理解Cortex-A53的转换表。目前没有成功。无法启用MMU。我想知道如何正确设置MMU。这是ARM的tutorial。
相关代码(启用):
__el2_cache:
mrs x0, SCTLR_EL2
bic x0, x0, #(1 << 0) /* Disable MMU */
bic x0, x0, #(1 << 2) /* Disable D-Cache */
bic x0, x0, #(1 << 12) /* Disable I-Cache */
msr SCTLR_EL2, x0
isb
/* Invalidate and clean I/D-Cache */
bl _cpu_icache_invalidate
bl _cpu_dcache_l1_invalidate
bl _cpu_dcache_l2_invalidate
__el2_pagetable:
/* Create pagetable for EL2 */
bl _cpu_el2_tlb_create
/* Invalidate (old) Pagetable */
tlbi ALLE2
dsb sy
isb
mrs x0, SCTLR_EL2
orr x0, x0, #(1 << 0) /* Enable MMU */
orr x0, x0, #(1 << 2) /* Enable D-Cache */
orr x0, x0, #(1 << 12) /* Enable I-Cache */
msr SCTLR_EL2, x0
isb /* <-- CPU hangs here */
nop
nop
nop
nop
字符串
当我不启用缓存时,它也不起作用。子过程调用中用于使缓存无效的code也基于ARM教程。
我在_cpu_el2_tlb_create
中创建转换表并设置相关寄存器:
ldr x1, =0x80803520
msr TCR_EL2, x1
ldr x1, =0x4400FF00
msr MAIR_EL2, x1
ldr x1, =_tlb_el2_tbb0_lv1
msr TTBR0_EL2, x1
mov x8, xzr
dsb sy
ret
型
使用与U-Boot相同的设置(内存类型,可共享,...),但仍然不工作。_cpu_el2_tlb_create
创建以下表:
Level 1 Level 2
0000000010006003 0000000000000711 0000000040000711 0000000080000711 00000000c0000711 00000000ff000401
0000000010007003 0000000000200711 0000000040200711 0000000080200711 00000000c0200711 00000000ff200401
0000000010008003 0000000000400711 0000000040400711 0000000080400711 00000000c0400711 00000000ff400401
0000000010009003 0000000000600711 0000000040600711 0000000080600711 00000000c0600711 00000000ff600401
000000001000a003 0000000000800711 0000000040800711 0000000080800711 00000000c0800711 00000000ff800401
0000000000000000 0000000000a00711 0000000040a00711 0000000080a00711 00000000c0a00711 00000000ffa00401
0000000000000000 0000000000c00711 0000000040c00711 0000000080c00711 00000000c0c00711 00000000ffc00401
0000000000000000 0000000000e00711 0000000040e00711 0000000080e00711 00000000c0e00711 00000000ffe00401
0000000000000000 0000000001000711 0000000041000711 0000000081000711 00000000c1000711 0000000000000000
[...]
0000000000000000 000000003ee00711 000000007ee00711 00000000bee00711 00000000fee00711 0000000000000000
0000000000000000 000000003f000711 000000007f000711 00000000bf000711 0000000000000000 0000000000000000
0000000000000000 000000003f200711 000000007f200711 00000000bf200711 0000000000000000 0000000000000000
0000000000000000 000000003f400711 000000007f400711 00000000bf400711 0000000000000000 0000000000000000
0000000000000000 000000003f600711 000000007f600711 00000000bf600711 0000000000000000 0000000000000000
0000000000000000 000000003f800711 000000007f800711 00000000bf800711 0000000000000000 0000000000000000
0000000000000000 000000003fa00711 000000007fa00711 00000000bfa00711 0000000000000000 0000000000000000
0000000000000000 000000003fc00711 000000007fc00711 00000000bfc00711 0000000000000000 0000000000000000
0000000000000000 000000003fe00711 000000007fe00711 00000000bfe00711 0000000000000000 0000000000000000
型TTBR0_EL2
也指向正确的位置,并且是4KiB对齐。
来自所用主板的内存设备Map:
0x00000000 - 0xFF000000 DDR-RAM
0xFF000000 - 0xFFFF0000 Memory-Mapped I/O
型
1条答案
按热度按时间vfh0ocws1#
我解决了这个问题。
不幸的是,我不明白翻译表和所需的设置。
现在我对EL 2的当前设置:
裸机应用程序的大小为
0x80000000
,链接器脚本中定义的大小为512 MiB。从我当前的链接器脚本中提取:
字符串
TCR_EL2
的一些设置:目前我使用1 TiB范围的
TOSZ
(0x17
),所以我也有一个只有一个条目的0级表。但稍后会减小此值。感谢@Siguza的提示。我使用4KiB颗粒的表。在索引0处仅包含一个条目,该条目指向第一个(也是唯一一个)1级表。所有其他条目无效(零)。
这些表包含两个有效的表条目。由于裸机应用程序从
0x80000000
开始,因此前1GiB项当前无效。因此,在索引2处存在裸机应用程序。级别中的索引3包含MMIO表的条目。所有其他后续条目无效。这些表包含256个2 MiB块条目,因为在链接器脚本中,我为应用程序定义了512 MiB。起始点是2级表的索引0。后续条目(256)无效。
这些表包含从索引503开始的8个2 MiB块条目,因为IOMap在起始点
0xFF000000
。前502个条目当前无效。现在我可以成功启用MMU了。