2012-12-02 38 views
2

所以,基本上,我想在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

+2

我不確定爲什麼要將身份映射描述爲醜陋的黑客攻擊,它是架構上指定的啓用MMU的方法,並且相當容易實現。 –

+0

@VariableLengthCoder那麼,最初啓用MMU並不是那麼糟糕。但是在地圖之間切換很煩人,因爲它需要在每個映射中都有一個具有相同VA的頁面。 –

回答

2

簡短的答案是,有沒有辦法完全符合你在ARMv7-A中所要求的。該ARM720T的例子是一個非常微架構特定的黑客攻擊,並且不能保證在不同的處理器之間可移植。

對於ARMv7-A沒有使用身份映射來打開/關閉MMU的可移植方式,但是對於更新轉換表: 您可以做什麼(在ARM720T中不可用)是使用TTBR1/TTBR0的組合來保存你的描述符。 TTBCR中的N字段配置覆蓋TTBR1表的TTBR0表的大小。這樣,只要您的TTB切換代碼位於通過與正在更新的TTBR不同的TTBR描述的區域中,就不會有地圖衝突。

另一種選擇是重寫TTBR0描述的轉換表,而不是切換。