如何在Linux / aarch64(Cortex-a57)上记录未对齐的内存访问?
我知道这里涉及两件不同的事情:
我的问题是,首先,我不知道如何从我的程序中管理cpu的控制寄存器(也不是 实际上在我的用户空间应用程序中执行它),其次,{{用于管理Linux中未对齐访问的接口似乎已经消失(我使用的是4.4.0内核),请参阅下面的链接。
管理来自内核的未对齐访问: https://www.kernel.org/doc/Documentation/arm/mem_alignment(可能已过时)
答案 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,以便计算程序触发的与未对齐访问相关的事件。没有办法陷阱或调试个别访问,因为可能存在对齐错误的钝器,但是否则它可以说更有用,因为它只会计数计数可归因于您的计划的事件。