在Linux内核中,有一个名为cpumask_t的数据结构,与该结构相关的定义如下:
1 /*代码位置:include/linux/cpumask.h*/
2 typedef struct { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
3
4 /*代码位置:include/linux/types.h*/
5 #define DECLARE_BITMAP(name,bits) \
6 unsigned long name[BITS_TO_LONGS(bits)]
7
8 /*代码位置:include/linux/bitops.h*/
9 #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_LONG)
10
11 /*代码位置:include/linux/kernel.h*/
12 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
13
14 /*代码位置:include/asm-x86/types.h*/
15 #ifdef CONFIG_X86_32
16 # define BITS_PER_LONG 32
17 #else
18 # define BITS_PER_LONG 64
19 #endif
其中,NR_CPUS是一个常量。上面这些,在下都能看懂,转化为C语言伪代码就是
unsigned long size = (NR_CPUS+31)/32;
typedef struct{unsigned long bits[size];} cpumask_t;
这里BITS_PER_LONG取32,(NR_CPUS+31)/32就是对(NR_CPUS/32)上取整。
问题是,下面这个宏在下就看不懂了
#define CPU_MASK_NONE \
(cpumask_t) { { \
[0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
} }
在下想请教各位大神,上面宏定义中的三个点"..."是什么意思啊?整个宏定义是什么意思?
为了向大家更清楚地说明问题,下面是内核代码中用CPU_MASK_NONE初始化cpumask_t的一个例子
cpumask_t populated = CPU_MASK_NONE;
希望各位大神不吝赐教,在下先行谢过!