zpcdcsdn
zpcdcsdn
2016-09-02 02:56

请教大家一个Linux内核中的C语言宏定义问题

10

在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;

希望各位大神不吝赐教,在下先行谢过!

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

3条回答