記憶體對齊¶
最近,由於核心程式碼中未被注意的記憶體未對齊訪問導致出現了很多問題。 因此,現在為基於 SA11x0 的目標無條件配置對齊修復。 根據 Alan Cox 的說法,取消配置它是個壞主意,但 Russell King 在某些被搞砸的 ARM 架構(如 EBSA110)上這樣做有一些很好的理由。 但是,在我所知的許多設計中並非如此,例如所有基於 SA11x0 的設計。
當然,依賴對齊陷阱來執行未對齊的記憶體訪問通常是個壞主意。 如果這些訪問是可預測的,那麼最好使用 include/linux/unaligned.h 提供的宏。 對齊陷阱可以修復異常情況下的未對齊訪問,但效能成本很高。 它最好很少發生。
現在,對於使用者空間應用程式,可以配置對齊陷阱,以便向執行未對齊訪問的任何程式碼傳送 SIGBUS 訊號(有利於除錯錯誤程式碼),甚至可以透過軟體修復訪問,就像核心程式碼一樣。 出於效能原因,不建議使用後一種模式(想想以大致相同方式工作的浮點模擬)。 修復你的程式碼代替!
請注意,在沒有經過深思熟慮的情況下隨機更改行為是非常糟糕的 - 它會更改使用者空間中所有未對齊指令的行為,並可能導致程式意外失敗。
要更改對齊陷阱行為,只需將一個數字回顯到 /proc/cpu/alignment 中。 該數字由各種位組成
位 |
設定時的行為 |
|---|---|
0 |
執行未對齊記憶體訪問的使用者程序將導致核心列印一條訊息,指示程序名稱、pid、pc、指令、地址和故障程式碼。 |
1 |
核心將嘗試修復執行未對齊訪問的使用者程序。 這當然很慢(想想浮點模擬器),不建議用於生產環境。 |
2 |
核心將向執行未對齊訪問的使用者程序傳送 SIGBUS 訊號。 |
請注意,並非所有組合都受支援 - 僅支援 0 到 5 的值。 (6 和 7 沒有意義)。
例如,以下操作將開啟警告,但不修復或傳送 SIGBUS 訊號
echo 1 > /proc/cpu/alignment
您還可以讀取同一檔案的內容,以獲取有關未對齊訪問事件的統計資訊,以及使用者空間程式碼的當前操作模式。
Nicolas Pitre,2001 年 3 月 13 日。Russell King 修改,2001 年 11 月 30 日。