以下行打印输出为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大小。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top