内存对齐

最近由于内核代码中未察觉的内存未对齐访问,出现了太多问题。因此,针对基于 SA11x0 的目标架构,现在无条件配置了对齐修正(alignment fixup)。根据 Alan Cox 的说法,将其配置掉是个坏主意,但 Russell King 对于像 EBSA110 这样糟糕的 ARM 架构有充分的理由这样做。然而,对于我所知的许多设计(例如所有基于 SA11x0 的设计),情况并非如此。

当然,通常情况下依赖对齐陷阱(alignment trap)来执行未对齐内存访问是一个坏主意。如果这些访问是可预测的,最好使用 include/linux/unaligned.h 提供的宏。对齐陷阱可以针对异常情况修正未对齐访问,但代价是高性能损耗。这种情况最好少见。

至于用户空间应用程序,可以配置对齐陷阱,向任何执行未对齐访问的代码发送 SIGBUS 信号(这对于调试糟糕的代码很有用),或者像内核代码那样通过软件修正访问。由于性能原因,不建议使用后一种模式(想想以同样方式工作的浮点模拟就知道了)。还是修正你的代码吧!

请注意,在没有深思熟虑的情况下随意更改行为是非常糟糕的——它会改变用户空间中所有未对齐指令的行为,并可能导致程序意外失败。

要更改对齐陷阱的行为,只需将一个数字 echo 到 /proc/cpu/alignment 中即可。该数字由不同的位组成

设置时的行为

0

执行未对齐内存访问的用户进程将导致内核打印一条消息,指示进程名称、PID、PC、指令、地址和故障代码。

1

内核将尝试修正执行未对齐访问的用户进程。这当然很慢(想想浮点模拟器),不建议在生产环境中使用。

2

内核将向执行未对齐访问的用户进程发送 SIGBUS 信号。

请注意,并非所有组合都受支持——仅支持 0 到 5 的值。(6 和 7 没有意义)。

例如,以下命令将开启警告,但不会进行修正或发送 SIGBUS 信号

echo 1 > /proc/cpu/alignment

您还可以读取同一文件的内容,以获取有关未对齐访问发生次数的统计信息,以及用户空间代码当前的运行模式。

Nicolas Pitre,2001 年 3 月 13 日。修改者 Russell King,2001 年 11 月 30 日。