我有一个适用于PowerPC的庞大源代码。我需要将它移植到ARM。但是,ARM在未对齐的内存访问上生成h / w异常。所以,我想找到所有可能发生未对齐内存访问异常的实例。我考虑过以下几种选择。
我的问题是,
答案 0 :(得分:3)
这取决于您的POWERPC处理器。像POWER8这样的高端服务器处理器几乎不会产生对齐异常。话虽如此,通常会有一个HID SPR位使对齐异常更频繁地发生。无论哪种方式,在Linux下,内核将处理它们并且用户不会看到它,除了性能损失。你可以设置prctl(PR_UNALIGN_SIGBUS),这将使内核生成一个SIGBUS,而不是处理它们。
在带有perf事件的linux中,您可以使用alignment-faults事件。例如" perf stat -e alignment-faults testcase"。此外,如果您打开CONFIG_PPC_EMULATED_STATS,您将获得一个名为" emulated_instructions"的调试条目。它有一个未对齐访问的条目。
答案 1 :(得分:2)
是和否。 PowerPC硬件在硬件中具有32位未对齐访问权限,无法轻松覆盖。但是如果你运行“裸机”而不是运行OS,你仍然可以通过将内存区域映射为I / O空间来强制它生成异常。这种方法很复杂,你可能会更好地手工检查代码。
对于64位访问,大多数PowerPC已经在未对齐访问时生成异常,如果您的硬件就是这种情况,则可以捕获它。这又需要在内核中发生,所以如果你在一个操作系统下运行你就不能轻易做到(内核会在没有告诉你的情况下处理软件中的未对齐访问)。
实际上,这只能在运行时确定,特别是如果你正在进行大量的指针运算。