2011-03-01 75 views
2

我正在對運行Linux內核的ARM Cortex A-8設備進行一些實驗。ARM鎖定寄存器寫操作使設備崩潰

我可以訪問和沒有任何問題讀L2高速緩存鎖定寄存器的值:

ASM易失性( 「MRC P15,1,%0,C9,C0,0」: 「= R」(I ));

當我嘗試的值寫回,該裝置立即崩潰:

ASM易失性( 「MCR P15,1,%0,C9,C0,0」: 「R」(I));

該代碼作爲內核模塊運行,因此沒有權限問題。

我不知道在寫這個寄存器值之前我是否缺少什麼特別的東西?

回答

3

有一個很長的清單,你需要小心,如果你打算玩高速緩存鎖定。 ARM的信息中心有一些提示:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/Chdeghcb.html

特別是,確保您的中斷被禁用,並且適當的指令/數據無效。同時檢查是否啓用了讀/寫訪問 - 即使您處於內核模式,也可能不會。您需要確保您的代碼不會跨越關鍵點的頁面或緩存行。這是真的很難得到正確的。你不能只是設置一個緩存方式鎖定,並期望一切工作,並且你不能只使用C中的內聯ASM來完成它。

最糟糕的情況下,你最終會干擾內部狀態機L2高速緩存控制器,鎖定錯誤數據,阻止數據完全緩存並導致所有內容中止,或使標籤不同步。這將解釋崩潰。

此外,這只是試驗或你是否想提高性能?如果你想關閉它(深度睡眠),這對於避免觸摸DRAM /總線來製作精心設計的代碼序列非常有用,但它通常不會取得成功。

+0

此外,找出您的設備中的核心修訂。查看ARM的網站,查找Cortex A-8的修訂版。有一個驚人的大勘誤,大部分是非用戶可見的,但嘿,你正在玩這個系統:) – 2011-03-01 07:53:29