内存对齐¶
最近,由于内核代码中未注意到的未对齐内存访问,出现了太多问题。因此,现在对于基于 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 日。