2016-09-20 51 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

因此,内核不可能为自己和用户空间设置不同的对齐错误处理方式?正如你所提到的,剖析是要走到这里的路。我想知道如果需要更严格的内存检查(如果这是有道理的) –