为什么在uni-processor上sizeof(spinlock_t)大于零?
-
06-07-2019 - |
题
以下行打印输出为4,而我期待为0.
printk(KERN_INFO "size of spinlock_t %d\n", sizeof(spinlock_t));
我在单个cpu的系统上试过这个。构建内核时没有启用调试标志,如 CONFIG_DEBUG_SPINLOCK或CONFIG_DEBUG_LOCK_ALLOC
。根据内核头文件,它应该为零,但输出与它不一致,任何猜测?
解决方案
我最好的猜测是,虽然你有一个CPU,但内核仍然使用 CONFIG_SMP
进行编译。
其他提示
spinlock_t始终是一个结构,它包含一个rawlock_t,与内核构建选项无关。 SMP和内核抢占可以为spinlock_t添加额外的字段,但spinlock_t始终是具有非零大小的具体类型。编译器需要spinlock_t才能解析为真正有效的C类型,否则它不会编译任何包含自旋锁的结构。如果没有抢占或SMP,则其自旋锁操作为NULL而不是结构。 为了支持零大小的结构会非常混乱,每个引用都需要通过预处理器宏,所以spinlock_t最终成为一个int(至少在x86上),对于大小较小的变量没有任何意义。超过4个字节,因为编译器可能填充任何变量以保持对齐。
据我所知,spinlock_t仅在CONFIG_SMP设置时启用,即在单处理器机器上禁用。因此,你可能会得到一些垃圾。
这取决于您的架构。如果你看一下 include / linux / spinlock_types_up.h
,你会发现它确实有时会出现0大小。
不隶属于 StackOverflow