Arm64 QEMU启用MMU后触发预取中止,无法访问地址求助
Arm64 EL1 MMU平映射启用时预取中止问题排查求助
背景与已完成配置
- 当前在Arm64架构EL1级别配置页表,最终目标为文本、栈、数据、只读数据设置不同访问权限并启用MTE,目前卡在平映射启用MMU的阶段。
- 采用newlib的CRT0,执行流程:CRT0调用
test.S中的_cpu_init_hook→ 进入main函数 → 调用mmu.c中的setup_mmu()。 _cpu_init_hook已完成操作:禁用核心0以外的其他核心、确保处于EL1级别、启用FP寄存器访问、设置中断向量。
页表配置细节
- 页表采用64kB颗粒大小、两级结构(Level2 + Level3),Level2页表指向由
add_pgtbl_entries()生成的Level3表项。 - 已为0x40000000至0x4008FFFF的内存范围生成9个Level3表项,所有页面均配置为RWX权限。
问题现象
- 写入
sctlr_el1启用MMU后,立即触发异常,无法执行下一条isb指令。 - 相关指令流:
0x0000000040001db4 <+276>: msr sctlr_el1, x1 0x0000000040001db8 <+280>: isb
- 编译带
DEBUG_TLB的QEMU验证后,确认异常为0x40001db8地址处的预取中止,ESR值为0x21/0x86000006。 - 尝试调整过部分位域,但因架构复杂性无法定位问题,恳请提供排查思路。已准备最小可复现示例代码(test.S、mmu.c、Makefile)。
内容的提问来源于stack exchange,提问作者stefanct
相关产品推荐
相关产品推荐

