我在armv8(aarch64)中编写了一个简单的内核。如何调试aarch64翻译错误?
MMU配置:
- 48 VA位(T1SZ = 64-48 = 16)
- 4K页大小
- 映射到内核虚拟存储器(上TTBR1_EL1)所有物理RAM平坦 (MMU与TTBR0_EL1 = 0活性,所以我只使用在地址为0xFFFF <地址>,所有平面映射到物理存储器)
我映射新的地址空间(从1开始的< < 40)到一些自由的物理区域。当我尝试访问的地址1 < < 40,I( “使用SP1 EL1,同步” 式的)得到一个异常:
ESR_EL1=0x96000044
FAR_EL1=0xffff010000000000
检查其他寄存器,我有:
TTBR1_EL1=0x82000000
TTBR1_EL1[2]=0x0000000082003003
所以,基于ARM架构参考手册ARMv8(ARMv8-A剖面):
- ESR(异常综合征寄存器)转化为:异常类= 100101(数据中止机智在第D7-1933页上的例外水平)发生变化。 WnR = 1(错误指令是写入); DFSC = 0b000100(级别0的翻译错误)D7-1958页;
- FAR_EL1是错误地址;它表示使用了TTBR1_EL1(因为高位全为1)。 VA前9位为0b000000010,表示表中使用了表项2;
- 表中的条目2表示物理地址0x82003000处的下一级表(低位0b11)。
因此,翻译失败在0级,它不应该。
我的问题是:我做错了什么?我是否错过了一些可能导致翻译错误的信息?而且,更一般地说,如何调试翻译错误?
更新:
在启用MMU之前写入表时,Everthing会起作用。
无论何时在启用MMU(通过平面映射表区域)后写入表格,映射都不会起作用。我想知道为什么发生这种情况我也尝试手动写入选定的表(以消除我的映射函数中的任何副作用):相同的结果(在MMU打开之前写入完成后,它工作;之后失败)。
我试过tlbi
和dsb sy
指令,其次是isb
,没有效果。此时只有一个CPU正在运行,所以缓存不应该成为问题 - 写入指令和MMU与相同的缓存对话(但我会在下一次测试它)。