zpcdcsdn 2016-09-02 02:56 采纳率: 0%
浏览 903
已结题

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

在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条回答

  • bestboyxie 2016-09-02 04:55
    关注

    宏定义的三个点数组 从0 到 BITS_TO_LONGS(NR_CPUS)-1 都初始化为0

    宏定义意思差不多就是 unsigned long bits[size] ;并且把数组0到 BITS_TO_LONGS(NR_CPUS)-1 初始化为0

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算