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

6

我有一个在PowerPC上运行的大型源代码项目。我需要将其移植到ARM上。但是,ARM会在访问非对齐内存时生成硬件异常。因此,我想找出所有可能导致非对齐内存访问异常的情况。我已经考虑了以下选项。

  1. 使用gcc中的-Wcast-align选项,它会为非对齐访问抛出警告。
  2. 使PowerPC生成非对齐例外。对于ARM,有一个/proc/cpu/alignment选项,用户可以决定如何处理异常。但是,对于PowerPC,没有这样的选项。

我的问题是:

  1. 有没有办法使PowerPC生成非对齐内存访问异常?
  2. 有没有更好的方法找出源代码中所有非对齐内存访问的发生情况?

你也可以直接移植、捕获并修复它。 :) - someuser
PowerPC总是会产生对齐异常,除了AltiVec的加载/存储指令。当然,你的操作系统可能会默默地处理这些异常,但那是另外一回事。 - Paul R
@someuser:由于硬件还未准备好,我现在无法移植代码。 - linuxfreak
@PaulR:好的。那么,我需要创建一个/proc/cpu/alignment条目并在内核中处理它吗? - linuxfreak
抱歉 - 我刚意识到我可能是错误的 - 不同的PowerPC CPU在这方面的行为可能不同 - 我是基于对桌面/服务器G3/G4/G5 CPU的经验来做出这个判断的 - 嵌入式设备可能会有不同的情况。 - Paul R
显示剩余3条评论
2个回答

5
  1. 这取决于你的POWERPC处理器。像POWER8这样的高端服务器处理器几乎永远不会产生对齐异常。尽管如此,通常有一个HID SPR位,使得对齐异常更容易发生。无论哪种情况,在Linux下,内核将处理它们,用户将看不到它们,除了性能损失。你可以设置prctl(PR_UNALIGN_SIGBUS),这将使内核生成SIGBUS,而不是处理它们。

  2. 在Linux中,使用perf事件时,您可以使用alignment-faults事件。例如,“perf stat -e alignment-faults testcase”。此外,如果您打开CONFIG_PPC_EMULATED_STATS,则会获得一个名为“emulated_instructions”的debugfs条目,其中包含有关未对齐访问的条目。


不如使用-Wcast-align编译并解决所有问题,这样做会更好吧? - linuxfreak
是的,如果可能的话最好避免这些。但有时不可避免,你可能需要检查一下。 - Mikey

3
  1. 是的和不是。PowerPC硬件具有硬件32位未对齐访问,这很难被覆盖。但如果您在“裸机”上运行而不是在操作系统下,仍然可以通过将内存区域映射为I/O空间来强制生成异常。虽然这种方法很复杂,但您最好还是手动查看代码。

    对于64位访问,大多数PowerPC已经在未对齐访问时生成异常,如果您的硬件也是如此,那么您就可以捕获它。同样,这需要在内核中发生,因此如果您在操作系统下运行,您无法轻松完成这项工作(内核将在软件中处理未对齐的访问而不告诉您)。

  2. 不一定,这只能在运行时进行确定,特别是如果您正在执行大量指针算术运算。


  1. 我正在操作系统上运行它,而不是在“裸机”上。是否可能创建/proc/cpu/alignment条目并在内核中处理异常?
  2. 看起来在运行时没有其他方法来完成它。那么,我们可以使用静态分析工具来查找所有实例吗?
- linuxfreak
2
在内核中模拟失败的访问,处理这种异常总是可能的。MIPS也是这样做的。但是,这会带来很大的性能损失,因此最好的方法是从源代码中尽可能排除它们,并将模拟作为备用方案。您可以在/proc文件系统中公开未对齐访问的计数器,还可以记录访问发生的地址,然后回顾性地在源代码中修复它们。我不知道任何静态分析工具可以捕获所有这些问题,而且我认为无法做到100%。 - ThomasH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接