预览加载中,请您耐心等待几秒...
1/1

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

linux中的内存对齐 1.原理 inta; intsize=8;<---->1000(bin) 计算a以size为倍数的下界数: 就让这个数(要计算的这个数)表示成二进制时,最后三位为0就可以达到这个目标。只要下面这个数与a进行"与运算"就可以了: 11111111111111111111111111111000 而上面这个数实际下就是~(size-1),可以将该数称为size的对齐掩码size_mask. 计算a以size为倍数的上下界数: #definealignment_down(a,size)(a&(~(size-1))) #definealignment_up(a,size)((a+size-1)&(~(size-1))) 注:上界数的计算方法,如果要求出比a大的是不是需要加上8就可以了?可是如果a本身就是8的倍数,这样加8不就错了吗,所以在a基础上加上(size-1),然后与size的对齐掩码进行与运算. 例如: a=0,size=8,则alignment_down(a,size)=0,alignment_up(a,size)=0. a=6,size=8,则alignment_down(a,size)=0,alignment_up(a,size)=8. a=8,size=8,则alignment_down(a,size)=8,alignment_up(a,size)=8. a=14,size=8,则alignment_down(a,size)=8,alignment_up(a,size)=16. 注:size应当为2的n次方,即2,4,8,16,32,64,128,256,1024,2048,4096... 2.在linux中的应用 上面的计算方法在linux等代码中也常常可以看到,下面给出几个例子: (1)当分配地址addr时,要将该地址以size为倍数对齐,而且要得到是比addr大的值,则使用_ALIGN宏: #define_ALIGN(addr,size)(((addr)+(size)-1)&(~((size)-1))) (2)与页面对齐相关的宏 #definePAGE_SIZE4096 #definePAGE_MASK(~(PAGE_SIZE-1)) #definePAGE_ALIGN(addr)-(((addr)+PAGE_SIZE-1)&PAGE_MASK) (3)与skb分配时对齐相关的宏 #defineSKB_DATA_ALIGN(X)(((X)+(SMP_CACHE_BYTES-1))&~(SMP_CACHE_BYTES-1))