网站导航: 首页 > 设计参考 > 正文 文章搜索
Arm结构体gcc内存边界对齐问题
 
文章编号:
081228165035
文章分类: 单片机 ARM
点 击:
...
关 键 词: gcc,内存,边界对齐
文章来源:
网络
摘 要:
这段时间移植公司的linux i386程序到Arm linux平台,本以为是件工作量很小的事情,以为只要改几个驱动程序就OK了,没想到在应用程序这一块卡了很长时间。其中最烦的事情就莫过于结构体内存边界对齐了。搞了这么久,

    这段时间移植公司的linux i386程序到Arm linux平台,本以为是件工作量很小的事情,以为只要改几个驱动程序就OK了,没想到在应用程序这一块卡了很长时间。其中最烦的事情就莫过于结构体内存边界对齐了。搞了这么久,终于终结了一些小经验。

默认情况下,在32位cpu里,gcc对于结构体的对齐方式是按照四个字节来对齐的。看以下结构体

 
  1. typedef struct pack{   
  2. char a;   
  3. int b;   
  4. short c;   
  5. }pack;  

 

对于Pack结构体,默认情况下在arm/386平台下(别的平台没试过)sizeof(pack)=12,求解过程如下:

 

 
  1. sizeof(char)=1;  

下一个int b,由于是四个字节,要求b的开始地址从32的整数倍开始,故需要在a后面填充3个没用的字节,记为dump(3),sizeof(b)=4,此时相当于结构体扩充为

 
  1. char a;   
  2. char dump(3);   
  3. int b;  

 

看short c,现在c的前面有8个字节,c是两个字节,c的开始地址是从16的整数开始,在b前面不需再加东西.此时对于结构体来说,sizeof(pack)=10,但是这不是最终结果,最后总的字节数也要能被4个字节整除,所以还需在short c后面再加

 
  1. dump(2);  

 

故总的字节数为12.

当然以上说的只是简单的情况,下面谈谈Arm,x86在gcc里关于内存边界字节对齐的区别.对于同样的结构体,在386下

 
  1. #prama pack(1)  

 

后,sizeof(pack)=1 4 2=7

而在arm下同样的操作sizeof(pack)=1 4 2 1=8,即虽然b根a之间不要填充但总的长度必须要是4的整数倍.

在ARM 下要使结构体按指定字节对齐,可行的方法

1.在makefile里加-fpack-struct 选项,这样的话对所有的结构按一字节对齐.

不得不说,确实有那么些质量较差的程序可能需要你部分自然对齐,部分一字 节对齐,此时

2.

 

 
  1. typedef struct pack{   
  2.   
  3. }__attribute__((packed))   

可利用__attribute__属性

当然最后的方式,还是自己去看ARM体系结构与gcc编译选项了。

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4