为什么在uni-processor上sizeof(spinlock_t)大于零?

时间:2009-10-26 17:10:42

标签: linux linux-kernel kernel

以下行打印输出为4,而我期待为0.

 printk(KERN_INFO "size of spinlock_t  %d\n", sizeof(spinlock_t));

我在单个cpu的系统上试过这个。在构建像CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC这样的内核时,没有启用调试标志。根据内核头文件,它应该为零,但输出与它不一致,任何猜测?

5 个答案:

答案 0 :(得分:5)

我最好的猜测是,虽然你有一个CPU,但内核仍然使用CONFIG_SMP设置进​​行编译。

答案 1 :(得分:3)

答案 2 :(得分:2)

spinlock_t始终是一个结构,它包含一个rawlock_t,与内核构建选项无关。 SMP和内核抢占可以为spinlock_t添加额外的字段,但spinlock_t始终是具有非零大小的具体类型。编译器需要spinlock_t才能解析为真正有效的C类型,否则它不会编译任何包含自旋锁的结构。如果没有抢占或SMP,则其自旋锁操作为NULL而不是结构。 为了支持零大小的结构会非常混乱,每个引用都需要通过预处理器宏,所以spinlock_t最终成为一个int(至少在x86上),对于大小较小的变量没有任何意义。超过4个字节,因为编译器可能填充任何变量以保持对齐。

答案 3 :(得分:1)

据我所知,spinlock_t仅在CONFIG_SMP设置时启用,即在单处理器机器上禁用。因此,你可能会得到一些垃圾。

答案 4 :(得分:0)

这取决于您的架构。如果你看一下include/linux/spinlock_types_up.h,你会发现它确实有时会出现0大小。