2016-09-20 104 views
2

如何在Linux/aarch64(Cortex-a57)上記錄未對齊的內存訪問?在Linux/aarch64上記錄和調試未對齊的訪問

據我所知,這裏涉及到兩個不同的東西:

  1. 選擇,以提高對非對齊存取從CPU的中斷(即中斷未對齊的內存訪問,否則將被CPU的支持性能成本)
  2. 選擇如何在Linux(它們記錄/火SIGBUS /軟仿真對齊訪問)處理這些中斷

我的問題是,第一,我不知道如何管理CPU的控制寄存器從我的程序(如果我的應該實際上在我的用戶空間應用程序中執行),第二,在Linux中管理未對齊訪問的界面似乎已經不存在了(我正在使用4.4.0內核),請參閱下面的鏈接。

從內核管理不對齊訪問: https://www.kernel.org/doc/Documentation/arm/mem_alignment(可能外的日期)

相關: Does AArch64 support unaligned access?

回答

1

你不能做到這一點。無論如何,不​​用Linux。

EL0的對齊錯誤由SCTLR_EL1.A位決定,但也會影響EL1。因此,即使您編寫了一個hacky內核模塊來啓用它(您顯然無法直接從用戶空間訪問特權系統控制寄存器),但您幾乎可以確保在下一個網絡數據包到達時內核會發生混亂。 arm64內核端口依賴於具有由AArch64提供的未對齊的訪問能力。它沒有ARM端口的/proc/cpu/alignment處理程序,因爲它沒有原先不支持未對齊訪問的ARMv6 CPU的遺留(至少在任何可用的方式下)。

什麼你可以做,雖然是用perf tools監視任何或所有的Cortex-A57的microarchitectural PMU events 0x68,0×69或的0x6A,算你的程序觸發了未對齊訪問相關的事件。沒有辦法陷入或調試單個訪問,因爲可能存在對齊錯誤的鈍器,但否則它可能更有用,因爲它只會將僅用於計數可歸因於您的程序的事件。

+0

因此,內核不可能爲自己和用戶空間設置不同的對齊錯誤處理方式?正如你所提到的,剖析是要走到這裏的路。我想知道如果需要更嚴格的內存檢查(如果這是有道理的) –