我正在玩C中的內存地址,並想知道這個主題名爲未對齊的內存訪問。未對齊的內存訪問
我目前在x86的英特爾與Linux內核,但問的話題拱和操作系統不可知論的精神 - 儘管下面是而 Linux和HW具體:
當我讀/寫一個簡單的類型從/到一個不對齊的地址我沒有任何錯誤。日誌中沒有消息或任何東西。我也試過:
perf top -e alignment-faults
# And with PID
perf top -p NNN -e alignment-faults
但沒有命中。
通過打開alignment checking:
__asm__("pushf\norl $0x40000,(%esp)\npopf");
給「通緝令」結果:(但仍然沒有在perf
消息)
Bus error (core dumped)
我的問題這是怎麼處理的硬件是+操作系統和什麼是最佳的。我的想法和問題是所有的地方,但我會盡力短語一些具體要點:
- 是否CPU具有對準上默認檢查,但內核發現關閉支持和指示它到不檢查?
- 作爲內核,至少我在其他硬件上經歷過這種情況,可能由於某些驅動程序試圖訪問未對齊的內存而得到oops:內核是否在對齊檢查中運行 -mode?或者,它可能只是代碼的某些部分呢?
- 由於未對齊內存的訪問需要更多資源;在軟件的測試階段啓用對齊檢查是一個不錯的主意,例如通過裝配線上面的流水線?這是否也會使它更便攜?
我對此有更多的問題,但現在就把它留在這裏。
爲什麼對齊甚至是一個話題的一個重要原因是因爲一些體系結構檢查和一個/一些不。那些可能會或可能沒有啓用/禁用。此外,檢查是在硬件中完成的,以致於存儲器/讀取週期出現故障。 –
從內存工作......我相信,英特爾(CISC)芯片可以管理未對齊的寫入 - 速度快。一般來說,RISC芯片(我相信其他SPARC)會在請求訪問未對齊的數據時產生總線錯誤(奇數內存地址上的2字節數量;地址上的4字節數量不是4個字節)等。一些芯片(DEC Alpha)產生一個內核陷阱並處理內核中未對齊的訪問 - 這是非常慢的。有一個命令「uam」來控制程序是否在未對齊的內存訪問上崩潰或內核陷阱發生。 –
對於你的第一個問題,我不認爲有開/關模式,這更像是操作系統或編譯器能否在軟件中處理由未對齊的內存訪問引發的問題。 如果可以處理,那麼我看不到爲什麼它會關閉某些代碼而沒有啓用其他某些代碼。 希望你找到以下兩個有用的鏈接, http://msdn.microsoft.com/en-us/library/aa290049%28v=vs.71%29.aspx http://lwn.net/Articles/ 260832/ – AquaAsh