这是我的代码:
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中收到任何消息。
为什么我没有得到例外?
答案 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目标执行此操作!