系统相关
首页 > 系统相关> > Linux中的结构分配在ARM中失败但在x86中成功

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