这是我的代码:

 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 for arm编译时,它会发出警告“cast增加了目标类型所需的对齐”。
但当我在arm处理器上运行它时,它不会生成未对齐的访问异常。
printf显示数据位于4的倍数的地址,因此data+1是一个奇数地址,应该会生成一个未对齐的异常。
我将/proc/cpu/alignment设置为3。在dmesg中没有收到任何消息。
为什么我没有得到例外?

最佳答案

在armv6+未对齐访问模型生效的地方,内核always clears the SCTLR.A bit(注意if (cpu_is_v6_unaligned())...部分),因为在实践中,对于在硬件中运行良好的东西,没有必要提出异常。只有未对齐时完全无效的指令(如ldm/stm)才会出现异常。

关于linux - ARM不会生成未对齐的异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25909691/

10-12 07:36
查看更多