ARMv5指令集的CPU(一般是arm9架构)默认不支持非对齐内存访问,ARMv6及以上的CPU默认支持处理大部分的非对齐内存地址访问。对齐指的是起始地址是一个word长度的整数倍,通常是4字节对齐。
通过设置/proc/cpu/alignment文件内容可修改内核中对非对齐地址访问的处理。
root@(none):~# cat /proc/cpu/alignment
User: 3905290
System: 0
Skipped: 0
Half: 0
Word: 0
DWord: 2672136
Multi: 1233154
User faults: 2 (fixup)
这个文件中最后一行"User faults"即是内核中如何处理非对齐的内存地址访问,这个值是一个位图:
#define UM_WARN (1 << 0)
#define UM_FIXUP (1 << 1)
#define UM_SIGNAL (1 << 2)
UM_WARN:只给出“Alignment trap”警告。
UM_FIXUP:尝试正确处理非对齐的内存地址。
UM_SIGNAL:发生非对齐地址访问时,发送SIGBUS信号通知相应进程。
几种处理方式可以进行组合,例如设置为(UM_WARN | UM_F