【问题标题】:Generate unaligned memory access exception in PowerPC在 PowerPC 中生成未对齐的内存访问异常
【发布时间】:2014-09-11 10:43:04
【问题描述】:

我有一个可在 PowerPC 上运行的庞大源代码。我需要将它移植到ARM。但是,ARM 在未对齐的内存访问时会生成硬件异常。所以,我想找到所有可能发生未对齐内存访问异常的实例。我考虑了以下选项。

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

我的问题是,

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

【问题讨论】:

  • 如何让PowerPC产生未对齐的内存访问异常——内核中的一些选项(CONFIG_ALIGNMENT_TRAP等)?
  • 您也可以移植、捕获和修复它。 :)
  • PowerPC 总是生成对齐异常,除了 AltiVec 加载/存储。当然,您的操作系统可能会默默地处理这些异常,但那是另一回事了。
  • @someuser:我现在无法移植代码,因为硬件还没有准备好。
  • @PaulR:好的。那么,我是否必须创建一个 /proc/cpu/alignment 条目并在内核中处理它?

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


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

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

【讨论】:

  • 与其做所有这些,不如使用 -Wcast-align 编译并修复所有问题?
  • 是的,最好尽可能避免这些。有时这是不可能的,你可能想检查一下。
【解决方案2】:
  1. 是的,不是的。 PowerPC 硬件在硬件中有 32 位非对齐访问,不能轻易覆盖。但是,如果您在“裸机”上运行而不是在操作系统下运行,您仍然可以通过将内存区域映射为 I/O 空间来强制它生成异常。虽然这种方法很复杂,但您最好手动查看代码。

    对于 64 位访问,大多数 PowerPC 已经在未对齐访问时生成异常,如果您的硬件出现这种情况,您可以捕获它。同样,这需要在内核中发生,因此如果您在操作系统下运行,您将无法轻松做到这一点(内核会在不告诉您的情况下处理软件中的未对齐访问)。

  2. 并非如此,这只能在运行时真正确定,尤其是在您进行大量指针运算时。

【讨论】:

  • 1) 我在操作系统而不是“裸机”上运行它。是否可以在内核中创建 /proc/cpu/alignment 条目并处理异常? 2)看起来在运行时没有其他方法可以做到这一点。那么,我们可以使用静态分析工具找出所有实例吗?
  • 通过模拟失败的访问,总是可以在内核中处理这种异常。这也是在 MIPS 上完成的方式。但是会有很大的性能损失,所以最好的方法是尽可能多地从源代码中剔除,并让仿真作为后盾。您可以在 /proc fs 中显示未对齐访问的计数器,还可以记录访问发生的地址,然后在源代码中追溯修复它们。我不知道有任何静态分析工具可以捕获所有这些,而且我认为不可能做到 100%。
猜你喜欢
  • 2019-01-02
  • 2010-11-07
  • 2013-10-21
  • 2011-07-31
  • 1970-01-01
  • 2014-06-25
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多