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, ALIG