1. 程式人生 > >linux核心裡面幾個特殊的巨集定義

linux核心裡面幾個特殊的巨集定義

1.BITS_TO_LONGS(nr)

#define BITS_PER_BYTE8

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型別結構體指標