2013-05-14 27 views
15

我正在開發一個實現了一些流密碼算法的寵物開源項目,而我在遇到只有在ARM處理器上運行它時才觸發的錯誤。我甚至嘗試在qemu下運行x86中的ARM二進制文件,但是在那裏沒有觸發該錯誤。如何捕獲未對齊的內存訪問?

該錯誤的具體機制仍然難以捉摸,但我的最佳觀點是相信它是由在我的程序中做出的未對齊的內存訪問嘗試造成的,這由qemu實現,但被我的真實ARM處理器默默忽略開發板。因此,由於問題顯示爲非常難以診斷,我想知道是否有任何工具可以用來捕獲我的正在運行的程序所產生的未對齊內存訪問,以便我可以清楚地看到在哪裏問題就會發生。

如果進程違反內存對齊限制,我也可以使用某種方式在我的ARM開發板上啓用一些信號(SIGBUS,也許?),就像我們在訪問未映射內存地址時獲取SIGSEGV一樣。它運行的是Linux 2.6.32。

+0

這至少與你正在使用的ARM架構有關。斷點是ARMv6 afaik。 – auselen 2013-05-15 06:30:38

回答

11

Linux可以爲您做修復或警告訪問。

您可以啓用/ proc/cpu/alignment中的行爲,請參閱http://www.mjmwired.net/kernel/Documentation/arm/mem_alignment以獲取不同值的說明。

0 - Do nothing (default behavior) 
1 - Warning in kernel-log with PC and Memory-Address printed. 
2 - Fixup error 
3 - Warn and Fixup 
4 - Send a SIGBUS to the process 
5 - Send SIGBUS and output Warning 
+1

對不起,我們是一個競賽條件。如果你想從我的答案中獲取信息,我會刪除它。 – 2013-05-14 17:42:02

+0

沒問題,讓OP決定。 ;)我只是在這裏幫忙。 – 2013-05-14 17:48:35

+0

我在x86或powerpc中看不到/ proc/cpu/alignment選項。在x86或powerpc的情況下,我們如何找出應用程序未對齊的訪問? – linuxfreak 2014-09-09 09:44:11

12

ARM Linux維護的對準處理器例外列表,

$ cat /proc/cpu/alignment 
User:   0 
System:   0 
Skipped:  0 
Half:   0 
Word:   0 
DWord:   0 
Multi:   0 
User faults: 0 (ignored) 

只有與PROCFS活躍,但很難想象一個系統,而無需PROCFS。處理此問題的具體代碼位於alignment.c。你可以使用echo 3 > /proc/cpu/alignment來讓Linux 修復的指令並提供一些dmesg的輸出。通常,通過仿真處理未對齊的訪問非常無效。更正代碼更好。附帶調試器的信號選項應該提供關於異常源的一些線索。

閱讀manual。 ;-)

+0

儘管我將/ proc/cpu/alignment設置爲5,但是在dmesg中我沒有看到任何消息。理想情況下,它應發送信號並生成警告。我錯過了什麼嗎? – linuxfreak 2014-09-18 09:43:08

+1

@linuxfreak您應該執行'cat/proc/cpu/alignment'並查看** User fault **行的內容(應該是* 5(signal + warn)*),並且您的內核可能會被修改。確認**用戶**行正在遞增。 [915行](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/mm/alignment.c#n915)有'printk',它是平庸的,所以大多數正常的日誌級別應該顯示它。如果**用戶**行不增加,那麼您可能有一個正在進行未對齊訪問的CPU。 – 2014-09-18 14:49:46