linux 内核 对齐,Linux运维知识之linux内核中ALIGN解析

本文主要向大家介绍了Linux运维知识之linux内核中ALIGN解析,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。

1. 在linux内核中,经产会看到对齐ALIGN的调用,常见的如内存管理中page对齐,net_device中私有数据的获取等,本文是对ALIGN宏的一个简单分析。

1.1. 内核调用:在e100.c中,网卡irq处理函数 irqreturn_t e100_intr(int irq, void *dev_id) 调用netdev_priv(netdev)处理函数获取net_device的私有数据。

2105 static irqreturn_t e100_intr(int irq, void *dev_id)2106 {2107   struct net_device *netdev = dev_id;2108   struct nic *nic = netdev_priv(netdev);

netdev_priv函数和ALIGN宏定义分别如下:

991 static inline void *netdev_priv(const struct net_device *dev) 992 {   993   return (char *)dev + ALIGN(sizeof(struct net_device), NETDEV_ALIGN); 994 }

41 #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) 42 #define __ALIGN_MASK(x,mask)  (((x)+(mask))&~(mask))

1.2 用法解析:

先说ALIGN的用法,ALIGN(x,a) 是为了使x以a为边界对齐,实现原理是给x加上一个最小的数,使x以a为边界对齐。举个例子,a = 8, x=0, ALIGN(x,a) 运算结果为0; a = 8, x = 3, 运算结果为8; a = 8, x = 11, 运算结果为16。

1.3原理分析:

为了便于分析,假设所用到的数字都是16bit,typeof是类型定义分析的时候可以忽略,假设为了使x以8位界对齐。

a = 8, 则上面mask= 7,那么 __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) 用二进制表示为:

X          xxxx xxxx

MASK                 + 0000 0111

进一步,以上公式可以分为x低 三位全为0(加mask后无进位)和低三位不全为0(加mask后有进位)两种情况。

1.3.1. x低三位全为0(加mask无进位)

即 x = xxxx x000,这种情况下,__ALIGN_MASK(x,mask)运算结果仍为x,而x本身就为8的倍数,因此x以8为界对齐。

1.3.2 x低三位不全为0 (加mask有进位)

x + mask 可理解为给x加7使得x向第四低位进位,同时低三位清零,运算后x = xxxx x000,同样为8的倍数,因此x以8为界对齐。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注系统运维Linux频道!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值