大小端及内存对齐问题细议

    在接触PowerPC开发时,难免会碰到大小端转换的问题,PowerPC系统核心是大端的,而像DMA、DSP、PCIE、FPGA都是小端的,所以有必要把它们详细记录一下。我们常常看到“alignment", "endian"之类的字眼, 但很少有C语言教材提到这些概念。实际上它们是与处理器与内存接口,编译器类型密切相关的。考虑这样一个例子:两个异构的CPU进行通信, 定义了这样一个结果来传递消息:

struct Message
{
     short opcode;
     char subfield;
     long message_length;
     char version;
     short destination_processor;
}message;

    用这样一个结构来传递消息貌似非常方便, 但也引发了这样一个问题: 若这两种不同的CPU对该结构的定义不一样, 两者就会对消息有不同的理解。有可能导致二义性。 会引发二义性的有这两个方面:

1.内存地址对齐

2.大小端定义

    本文先介绍内存地址对齐和大小端的概念,再回头来看这个例子就会豁然开朗了。

    内存地址对齐,英文名为" Byte Alignment"。大部分16位和32位的CPU不允许将字或者长字存储到内存中的任意地址。 比如MPC 83xx系列就不允许将16位的字存储到奇数地址中,将一个16位的字写到奇数地址将引发异常。

    实际上, 对于c中的字节组织, 有这样的对齐规则:   

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值