Linux中的结构分配在ARM中失败但在x86中成功
作者:互联网
我注意到一些非常奇怪的东西.
说我已经定义了以下结构
typedef struct
{
uint32_t a;
uint16_t b;
uint32_t c;
} foo;
这个结构包含在我从网络接收的大缓冲区中.
以下代码适用于x86,但我在ARM上收到SIGBUS.
extern void * buffer;
foo my_foo;
my_foo = (( foo * ) buffer)[0];
用memcpy替换解除引用的指针解决了这个问题.
在ARM中搜索SIGBUS时,我发现这与内存对齐somwhow有关.
有人可以解释发生了什么吗?
解决方法:
您自己说过:您的特定处理器存在内存对齐限制,并且缓冲区未正确对齐以允许从中读取大于一个字节的内容.该任务可能被编译成更大实体的三个动作.
使用memcpy()时,没有对齐限制,它必须能够在任意两个地址之间进行复制,因此它可以执行任何操作.可能会逐字节地复制,直到地址对齐为止,这是一种常见的模式.
顺便说一句,我发现在没有数组索引的情况下编写代码更加清晰:
extern const void *buffer;
const foo my_foo = *(const foo *) buffer;
标签:c-3,linux,arm,memory-alignment,sigbus 来源: https://codeday.me/bug/20190723/1508474.html