ARM不会生成未对齐的异常

时间:2014-09-18 10:02:17

标签: linux gcc linux-kernel arm memory-alignment

这是我的代码:

 char data[5]  = {0x1, 0x2, 0x3, 0x4, 0x5 };
 int *ptr = (int *)(data + 1);
 int value = *ptr;

 printf("address of data= %lu\n",data);
 printf("address of data +1 = %lu\n",data+1);

当我使用gcc -Wcast-align为ARM编译时,它会发出警告“强制增加所需的目标类型对齐”。

但是当我在ARM处理器上运行它时,不会产生未对齐的访问异常

printf显示数据位于4的倍数地址,因此数据+ 1是奇数地址,应产生未对齐的异常。

我将/ proc / cpu / alignment设置为3.没有在dmesg中收到任何消息。

为什么我没有得到例外?

2 个答案:

答案 0 :(得分:4)

在ARMv6 +未对齐访问模型生效的情况下,内核always clears the SCTLR.A bit(请注意if (cpu_is_v6_unaligned())...部分),因为在实践中,对于可以在硬件中正常工作的事物引发异常几乎没有意义。只有在未对齐的情况下才能获得完全无效的指令的异常,例如LDM / STM。

答案 1 :(得分:3)

1:也许内核总是允许对数据类型< = 32位进行未对齐访问,并忽略你的/ proc设置。

2:你检查过生成的汇编代码了吗?编译器可能已经优化了ptr变量,只是将来自& data [1]的4个字节memcpy到& value。这样,无论设置如何,您都无法获得异常。 ARM编译器在检测到未对齐访问时为Cortex-M3目标执行此操作!