2014-09-11 28 views
5

我有一個可在PowerPC上運行的巨大源代碼。我需要將它移植到ARM。但是,ARM會在未對齊的內存訪問上產生h/w異常。所以,我想找到所有可能發生未對齊內存訪問異常的實例。我考慮了以下選項。在PowerPC中生成未對齊的內存訪問異常

  1. 在gcc中使用-Wcast-align會引發未對齊訪問的警告。
  2. 使PowerPC生成未對齊的異常。對於ARM,有一個選項/ proc/cpu/alignment,用戶可以通過該選項決定如何處理異常。但是,PowerPC沒有這種選擇。

我的問題是,

  1. 有沒有一種方法,使PowerPC的生成未對齊的內存訪問異常?
  2. 有沒有更好的方法來找出源代碼中所有未對齊內存訪問的發生?
+0

使PowerPC生成未對齊的內存訪問異常的方法 - 內核中的一些選項(CONFIG_ALIGNMENT_TRAP等)? – someuser 2014-09-11 10:51:40

+0

你也可以只是端口,捕捉並修復它。 :) – someuser 2014-09-11 10:53:41

+0

除了AltiVec的加載/存儲外,PowerPC總是會產生對齊異常。當然你的操作系統可能會默默地處理這些異常,但這是另一回事。 – 2014-09-11 10:54:54

回答

2
  1. 這取決於你的POWERPC處理器。像POWER8這樣的高端服務器處理器幾乎不會產生對齊異常。這就是說,通常有一個HID SPR位可以更頻繁地發生對齊異常。無論哪種方式,在Linux下,內核將處理它們,除了性能損失之外,用戶不會看到它。您可以設置prctl(PR_UNALIGN_SIGBUS),這將使內核生成一個SIGBUS,而不是處理它們。

  2. 在具有perf事件的linux中,您可以使用alignment-faults事件。例如「perf stat -e alignment-faults testcase」。另外,如果打開CONFIG_PPC_EMULATED_STATS,則會得到一個名爲「emulated_instructions」的debugfs條目,其中有一個用於未對齊訪問的條目。

+0

而不是做所有這些,使用-Wcast-align編譯並修復所有問題不是更好嗎? – linuxfreak 2014-09-12 09:06:06

+0

是的,最好儘可能避免這些。有時候這是不可能的,你可能想要檢查。 – 2014-09-14 00:39:40

2
  1. 是的,沒有。 PowerPC硬件在硬件中具有32位的未對齊訪問,不容易被覆蓋。但是如果你在「裸機」上運行而不是在OS下運行,你仍然可以強制它通過將內存區域映射爲I/O空間來產生異常。儘管這種方法很複雜,你可能會更好地手工審查代碼。

    對於64位訪問,大多數PowerPC都會在未對齊訪問時產生異常,如果硬件出現這種情況,您可以將其捕獲。再次,這需要發生在內核中,所以如果你在一個操作系統下運行,你很難做到這一點(然後內核會處理軟件中的未對齊訪問,而不會告訴你)。

  2. 不是真的,這隻能在運行時真正確定,特別是如果您正在進行大量指針運算。

+0

1)我在OS上運行它,而不是「裸機」。是否可以創建/ proc/cpu/alignment入口並處理內核中的異常? 2)看起來沒有其他的方法可以在運行時執行它。那麼,我們可以使用靜態分析工具來找出所有的實例嗎? – linuxfreak 2014-09-11 11:04:39

+2

通過模擬失敗的訪問,始終可以在內核中處理這種異常。這也是MIPS所做的。但是性能會受到很大的影響,所以最好的方法是儘可能多地從源代碼中刪除掉,並將仿真作爲反向停止。您可以爲/ proc fs中的未對齊訪問設置一個計數器,並且還可以記錄訪問發生的地址,然後在源代碼中追溯修復它們。我不知道有任何靜態分析工具可以捕獲所有這些,我認爲不可能做到100%。 – ThomasH 2014-09-11 11:10:57