您所在位置: 网站首页 / linux中的内存对齐.doc / 文档详情
linux中的内存对齐.doc 立即下载
2024-12-04
约1.1千字
约1页
0
27KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

linux中的内存对齐.doc

linux中的内存对齐.doc

预览

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

10 金币

下载文档

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

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))
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

linux中的内存对齐

文档大小:27KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用