我在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與相同的緩存對話(但我會在下一次測試它)。