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

lin*_*eak 6 c gcc powerpc memory-alignment embedded-linux

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

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

我的问题是,

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

小智 5

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

  2. 在具有 perf 事件的 Linux 中,您可以使用alignment-faults 事件。例如“perf stat -e 对齐错误测试用例”。此外,如果您打开 CONFIG_PPC_EMULATED_STATS,您将获得一个名为“emulated_instructions”的 debugfs 条目,其中有一个用于未对齐访问的条目。