在PowerPC中生成未对齐的内存访问异常

时间:2014-09-11 10:43:04

标签: c gcc embedded-linux memory-alignment powerpc

我有一个适用于PowerPC的庞大源代码。我需要将它移植到ARM。但是,ARM在未对齐的内存访问上生成h / w异常。所以,我想找到所有可能发生未对齐内存访问异常的实例。我考虑过以下几种选择。

  1. 在gcc中使用-Wcast-align会对未对齐的访问产生警告。
  2. 使PowerPC生成未对齐的异常。对于ARM,有一个选项/ proc / cpu / alignment,用户可以通过该选项决定如何处理异常。但是,PowerPC没有这样的选择。
  3. 我的问题是,

    1. 有没有办法让PowerPC生成未对齐的内存访问异常?
    2. 有没有更好的方法可以找到源代码中所有未对齐内存访问的出现?

2 个答案:

答案 0 :(得分:3)

  1. 这取决于您的POWERPC处理器。像POWER8这样的高端服务器处理器几乎不会产生对齐异常。话虽如此,通常会有一个HID SPR位使对齐异常更频繁地发生。无论哪种方式,在Linux下,内核将处理它们并且用户不会看到它,除了性能损失。你可以设置prctl(PR_UNALIGN_SIGBUS),这将使内核生成一个SIGBUS,而不是处理它们。

  2. 在带有perf事件的linux中,您可以使用alignment-faults事件。例如" perf stat -e alignment-faults testcase"。此外,如果您打开CONFIG_PPC_EMULATED_STATS,您将获得一个名为" emulated_instructions"的调试条目。它有一个未对齐访问的条目。

答案 1 :(得分:2)

  1. 是和否。 PowerPC硬件在硬件中具有32位未对齐访问权限,无法轻松覆盖。但是如果你运行“裸机”而不是运行OS,你仍然可以通过将内存区域映射为I / O空间来强制它生成异常。这种方法很复杂,你可能会更好地手工检查代码。

    对于64位访问,大多数PowerPC已经在未对齐访问时生成异常,如果您的硬件就是这种情况,则可以捕获它。这又需要在内核中发生,所以如果你在一个操作系统下运行你就不能轻易做到(内核会在没有告诉你的情况下处理软件中的未对齐访问)。

  2. 实际上,这只能在运行时确定,特别是如果你正在进行大量的指针运算。