linux内核里面几个特殊的宏定义

时间:2021-09-21 12:31:50

1.BITS_TO_LONGS(nr)

#define BITS_PER_BYTE 8

define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))

#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))

DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))为DIV_ROUND_UP(nr, 32)

所以BITS_TO_LONGS(nr)为(nr + 31)/32,就是求nr数字是32的多少倍。


2.ALIGN(x,a)


#define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1)

#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))

typeof(x)(a)表示用X的类型来重定义a,

然后算出X,以mask为掩码的上界数。

 计算a以size为倍数的上下界数:

 #define alignment_down(a, size) (a & (~(size-1)) )
#define alignment_up(a, size)   ((a+size-1) & (~ (size-1)))

注意size为2的n次方


3.#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))

该宏是用e来使函数在编译的时候判断能否继续编译进行,当e为0是,编译通过,当e为非0时非法语句,编译不通过。


4.#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) * __mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })

该宏通过已知tpye类型的结构体中的一个成员的指针,找到这个结构体的指针。该宏返回type类型结构体指针