内存对齐

最近,由于内核代码中未被注意的内存未对齐访问导致出现了很多问题。 因此,现在为基于 SA11x0 的目标无条件配置对齐修复。 根据 Alan Cox 的说法,取消配置它是个坏主意,但 Russell King 在某些被搞砸的 ARM 架构(如 EBSA110)上这样做有一些很好的理由。 但是,在我所知的许多设计中并非如此,例如所有基于 SA11x0 的设计。

当然,依赖对齐陷阱来执行未对齐的内存访问通常是个坏主意。 如果这些访问是可预测的,那么最好使用 include/linux/unaligned.h 提供的宏。 对齐陷阱可以修复异常情况下的未对齐访问,但性能成本很高。 它最好很少发生。

现在,对于用户空间应用程序,可以配置对齐陷阱,以便向执行未对齐访问的任何代码发送 SIGBUS 信号(有利于调试错误代码),甚至可以通过软件修复访问,就像内核代码一样。 出于性能原因,不建议使用后一种模式(想想以大致相同方式工作的浮点仿真)。 修复你的代码代替!

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

要更改对齐陷阱行为,只需将一个数字回显到 /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 日。