所以,基本上,我想在ARMv7內核上啓用內存管理單元。實際的程序非常簡單。我只需要將轉換表的地址加載到TTBR0
,並使用控制寄存器啓用MMU。現在啓用ARMv7 VMSA內存管理單元?
/* enable mmu */
mcr p15, 0, r0, c2, c0, 0
mrc p15, 0, r12, c1, c0, 0
orr r12, r12, #0x1
mcr p15, 0, r12, c1, c0, 0
,這個問題只要MMU啓用發生,因爲ARMv7體系(不同於ARM架構的一些其它版本),CPU開始從虛擬地址立即獲取。因此,如果引導加載程序在0x10000000
上運行,然後啓用MMU,除非它首先進入標識映射,否則在0x10000004
處的下一個提取將導致預取中止。現在,我意識到可以在初始啓用MMU期間使用身份映射來完成此操作。但是,切換轉換表時(將新值加載到TTBR0
)也會發生同樣的問題。
所以,基本上,我正在尋找加載新值TTBR0
(或剛打開MMU上),然後,立即跳轉到新的地址,這將是有效的或多或少直接的方式在新地圖中。這在早期的體系結構中是可能的,因爲在啓用MMU或更改狀態的指令之後至少有4條指令從舊地址中獲取。理想情況下,我希望能夠做到這一點,而不依賴於令人難以置信的醜陋黑客行爲,因爲每次您要切換頁表或打開MMU時都必須創建身份映射。
爲了澄清我的意思,當我說的是較舊的架構,這裏是對ARM信息中心頁面的鏈接解釋如何打開MMU的ARM720T:7.16.1. Enabling the MMU
我不確定爲什麼要將身份映射描述爲醜陋的黑客攻擊,它是架構上指定的啓用MMU的方法,並且相當容易實現。 –
@VariableLengthCoder那麼,最初啓用MMU並不是那麼糟糕。但是在地圖之間切換很煩人,因爲它需要在每個映射中都有一個具有相同VA的頁面。 –