container_of请参考:container_of宏的简介及使用-CSDN博客
BITS_TO_LONGS宏定义如下:
#define BITS_PER_BYTE 8
#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))#define BITS_TO_LONGS(x) (((x) + 8 * sizeof (unsigned long) - 1) / (8 * sizeof (unsigned long)))#if 0
我们把#define BITS_TO_LONGS(x) (((x) + 8 * sizeof (unsigned long) - 1) / (8 * sizeof (unsigned long)))简化一下,变成如下:
#define BITS_TO_LONGS(x) (((x) + 8 - 1) / (8))#endif
BITS_TO_LONGS(x):x个bit位需要用多少个long来表示。这个解释有点拗口。举个例子:
long在64位系统默认是8字节:
BITS_TO_LONGS(1)=1, //1个bit位,需要用1个long来表示。1个long就是64bit
BITS_TO_LONGS(64)=1, //64个bit位,需要用1个long来表示。2个long就是64bit
BITS_TO_LONGS(65)=2 //65个bit位,需要用2个long来表示。1个long是64bit,所以65bit需要用2个long来表示
BIT_WORD、BIT_MASK:
#ifdef CONFIG_64BIT
#define BITS_PER_LONG 64
#else
#define BITS_PER_LONG 32
#endif /* CONFIG_64BIT */#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
BIT_MASK(nr):将1左移nr对64取余的值的位数
BIT_WORD(nr):nr除以64的值