2013-10-14 83 views
2

我正在玩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) 


我的問題這是怎麼處理的硬件是+操作系統和什麼是最佳的。我的想法和問題是所有的地方,但我會盡力短語一些具體要點:

  1. 是否CPU具有對準上默認檢查,但內核發現關閉支持和指示它到不檢查
  2. 作爲內核,至少我在其他硬件上經歷過這種情況,可能由於某些驅動程序試圖訪問未對齊的內存而得到oops:內核是否在對齊檢查中運行 -mode?或者,它可能只是代碼的某些部分呢?
  3. 由於未對齊內存的訪問需要更多資源;在軟件的測試階段啓用對齊檢查是一個不錯的主意,例如通過裝配線上面的流水線?這是否也會使它更便攜?

我對此有更多的問題,但現在就把它留在這裏。

+1

爲什麼對齊甚至是一個話題的一個重要原因是因爲一些體系結構檢查和一個/一些不。那些可能會或可能沒有啓用/禁用。此外,檢查是在硬件中完成的,以致於存儲器/讀取週期出現故障。 –

+2

從內存工作......我相信,英特爾(CISC)芯片可以管理未對齊的寫入 - 速度快。一般來說,RISC芯片(我相信其他SPARC)會在請求訪問未對齊的數據時產生總線錯誤(奇數內存地址上的2字節數量;地址上的4字節數量不是4個字節)等。一些芯片(DEC Alpha)產生一個內核陷阱並處理內核中未對齊的訪問 - 這是非常慢的。有一個命令「uam」來控制程序是否在未對齊的內存訪問上崩潰或內核陷阱發生。 –

+0

對於你的第一個問題,我不認爲有開/關模式,這更像是操作系統或編譯器能否在軟件中處理由未對齊的內存訪問引發的問題。 如果可以處理,那麼我看不到爲什麼它會關閉某些代碼而沒有啓用其他某些代碼。 希望你找到以下兩個有用的鏈接, http://msdn.microsoft.com/en-us/library/aa290049%28v=vs.71%29.aspx http://lwn.net/Articles/ 260832/ – AquaAsh

回答

2

只是試圖給出部分答案。

默認情況下CPU是否有對齊檢查,但內核 檢測到關閉被支持並指示它不檢查?

它依賴於拱門,甚至在同一個拱門上,它可能是一些關於未對齊內存的指令可以由硬件處理,而另一些則不能。

內核,至少我在其他HW遇到過,可以得到由於一些司機試圖訪問未對齊的內存 哎呀:確實在調整檢查模式的 內核運行?或者,它可能只是某些 部分代碼呢?

硬件不支持未對齊的內存訪問將導致陷阱和內核具有陷阱/異常的處理程序。 我一直在ppc上工作,這種異常將根據指令處理(從PC獲得);一些指令被照顧並且程序將恢復;一些其他人可能會導致程序因內核無法處理而終止。一個這樣的例子是用於實現比較和交換邏輯的stwcx指令。

由於訪問未對齊的內存需要更多資源;在軟件的測試階段,通過例如上面的程序集 行來啓用對齊檢查是否是一個很好的想法?這是否也會使它更便攜?

實際上,如果您在大型項目中有大量遺留代碼,這可能不是一個好主意.....但它對新代碼應該很好。