在Linux / aarch64上记录和调试未对齐的访问

时间:2016-09-20 14:07:53

标签: linux linux-kernel memory-alignment arm64 cortex-a

如何在Linux / aarch64(Cortex-a57)上记录未对齐的内存访问?

我知道这里涉及两件不同的事情:

  1. 选择在未对齐访问时从cpu引发中断(即,对于未经对齐的内存访问的中断,否则将以性能成本支持cpu)
  2. 选择如何在Linux中处理这些中断(记录/触发SIGBUS /软模拟未对齐访问)
  3. 我的问题是,首先,我不知道如何从我的程序中管理cpu的控制寄存器(也不是 实际上在我的用户空间应用程序中执行它),其次,{{用于管理Linux中未对齐访问的接口似乎已经消失(我使用的是4.4.0内核),请参阅下面的链接。

    管理来自内核的未对齐访问: https://www.kernel.org/doc/Documentation/arm/mem_alignment(可能已过时)

    相关: Does AArch64 support unaligned access?

1 个答案:

答案 0 :(得分:1)

你不能这样做。无论如何,不​​是用Linux。

EL0的对齐故障由SCTLR_EL1.A位控制,但这也会影响EL1。因此,即使你编写了一个hacky内核模块来启用它(你显然无法直接从用户空间触摸特权系统控制寄存器),你几乎可以保证内核会很快发生恐慌。当下一个网络数据包到达时。 arm64内核端口依赖于具有AArch64提供的未对齐访问功能。它没有ARM端口的/proc/cpu/alignment处理程序,因为它没有前ARMv6 CPU的遗留根本不支持未对齐访问(嗯,以任何可用的方式至少)。

可以做什么,使用perf tools来监控任何或所有Cortex-A57的microarchitectural PMU events 0x68,0x69或0x6a,以便计算程序触发的与未对齐访问相关的事件。没有办法陷阱或调试个别访问,因为可能存在对齐错误的钝器,但是否则它可以说更有用,因为它只会计数计数可归因于您的计划的事件。