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

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集