以下行打印输出为4,而我期待为0.
printk(KERN_INFO "size of spinlock_t %d\n", sizeof(spinlock_t));
我在单个cpu的系统上试过这个。在构建像CONFIG_DEBUG_SPINLOCK or CONFIG_DEBUG_LOCK_ALLOC
这样的内核时,没有启用调试标志。根据内核头文件,它应该为零,但输出与它不一致,任何猜测?
答案 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大小。