[英]How to trap unaligned memory access?
我正在開發一個寵物開源項目,它實現了一些流密碼算法,我遇到的問題只有在我在ARM處理器上運行時才會觸發。 我甚至嘗試在qemu下運行x86中的ARM二進制文件,但是那里沒有觸發bug。
這個bug的具體機制仍然是難以捉摸的,但我最好的辦法是相信它是由我的程序中未對齊的內存訪問嘗試引起的,這是由qemu實現的,但是我的開發板中真正的ARM處理器默默地忽略了它。
因此,由於問題顯示非常難以診斷,我想知道是否有任何工具可用於捕獲我運行的程序所做的未對齊內存訪問,以便我可以確切地看到問題發生的位置。
我還可以使用某種方式在我的ARM開發板上啟用一些信號(SIGBUS,可能?),如果進程違反了內存對齊限制,就像我們在訪問未映射的內存地址時得到SIGSEGV一樣。 它運行的是Linux 2.6.32。
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
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
輸出。 通常,通過仿真處理未對齊的訪問非常低效。 最好糾正代碼。 附加調試器的信號選項應該提供一些關於異常源的線索。
閱讀手冊 。 ;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.