ARM Cortex-A72地址转换排障:L1/L2转换与寄存器分析求助
ARM Cortex-A72 地址转换流程求助
已知虚拟-物理地址对应关系
- Virtual_1 = 0xc7c01000, Physical_1 = 0x09170000
- Virtual_2 = 0xc7c11000, Physical_2 = 0x0916E000
- Virtual_3 = 0x01060000, Physical_3 = 0x101F1000
相关寄存器值
TTBR0_EL1 0x3000095c92000 844427443118080 TTBR1_EL1 0x0 0 TTBR0_EL2 0x0 0 TCR_EL1 0x80003500 2147497216 TCR_EL2 0x0 0 VTCR_EL2 0x0 0 SCTLR 0x10c51905 281352453 SCTLR_EL2 0x0 0 MAIR_EL1 0xffbb00 16759552 ID_AA64MMFR0_EL1 0x1124 4388
问题描述
参照ARM官方文档尝试计算虚拟地址到物理地址的转换流程,但未成功:
- 按一级地址转换规范执行时,虚拟地址前19位与物理地址前19位不匹配,且无法访问一级描述符地址,怀疑未启用一级转换。
- 假设启用二级地址转换,执行流程同样失败,无法访问一级描述符地址,进而无法获取二级描述符地址、二级表基地址及小页基地址。GDB调试信息如下:
(gdb) x/4x 0x95c931f0 0x95c931f0: Cannot access memory at address 0x95c931f0
待解答问题
- 当前使用的是一级地址转换还是二级地址转换?如何通过寄存器值判定?
- 一级表与二级表的地址位于何处?
- 地址转换的具体执行流程是怎样的?
- 如何实现虚拟地址与物理地址的相互转换?
补充信息
- Bootloader及应用程序在QEMU中运行,无法使用硬件调试器,仅通过GDB调试。
编辑1:RAM导出分析推论
从物理RAM起始地址导出全部RAM并分析后,得出以下推论:
- Virtual_1、Virtual_2、Virtual_3地址在RAM中位于两个不同偏移地址处。
- Physical_1地址在RAM中位于三个不同偏移地址处,Physical_2地址位于两个不同偏移地址处,Physical_3地址不在RAM中。
- Virtual_1与Virtual_2对应的物理地址在RAM中位于以0x4aXXX开头的连续偏移地址处:
00 01 02 03 04 05 06 07 Ex: 0x95c40000 + 0x4A0A4 -> 00 10 c0 c7 00 00 17 09 0xc7c01000 0x09170000
- Virtual_1、Virtual_2、Virtual_3地址在RAM中位于以0x56fXX开头的连续偏移地址处:
Bytes -> 00 01 02 03 04 05 06 07 Ex: 0x95c40000 + 0x56f08 -> 00 10 c1 c7 00 10 c0 c7 Hex -> 0xc7c11000 0xc7c01000 08 09 0a 0b 0c 0d 0e 0f 00 00 00 00 00 00 00 00 0x00000000 0x00000000 00 01 02 03 04 05 06 07 01 00 06 01 00 00 06 01 0x01060001 0x1060000
虚拟/物理地址在RAM中的位置
Virtual_1 = 0xc7c01000 Physical_1 = 0x9170000 MemVirt = 0x95C40000 + 0x4a0a4 / 0x56f0c MemPhy = 0x95C40000 + 0x4a0a8 / 0x4a0b8 / 0x4cba8 Virtual_2 = 0xc7c11000 Physical_2 = 0x916E000 MemVirt_2 = 0x95C40000 + 0x4a174 / 0x56f08 MemPhy_2 = 0x95C40000 + 0x4a178 / 0x4a188 Virtual_3 = 0x1060000 Physical_3 = 0x101F1000 MemVirt_3 = 0x95C40000 + 0x4a00c / 0x56f18 MemPhy_3 = ?
内容的提问来源于stack exchange,提问作者Purgoufr
相关产品推荐
相关产品推荐

