ユニプロセッサで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が1つでも、カーネルは CONFIG_SMP
が設定された状態でコンパイルされているということです。
他のヒント
spinlock_tは常に構造体であり、カーネルビルドオプションに関係なくrawlock_tを含みます。 SMPおよびカーネルプリエンプションはspinlock_tに余分なフィールドを追加できますが、spinlock_tは常にサイズがゼロでない具体的なタイプです。コンパイラは、実際の有効なC型に解決するためにspinlock_tを必要とします。そうしないと、スピンロックを組み込んだ構造をコンパイルしません。プリエンプションまたはSMPがない場合、その構造はNULLではないスピンロック操作です。 サイズがゼロの構造をサポートするには非常に面倒で、すべての参照はプリプロセッサマクロを介して行われる必要があるため、spinlock_tは(少なくともx86では)intになり、サイズが小さい変数にはポイントがありませんコンパイラーは、アライメントを維持するために変数をパディングする可能性が高いため、4バイト未満です。
私が覚えていることから、spinlock_tはCONFIG_SMPが設定されている場合にのみ有効になります。つまり、ユニプロセッサマシンでは無効になります。そのため、ゴミが発生する可能性があります。
これはアーキテクチャによって異なります。 include / linux / spinlock_types_up.h
を見ると、実際にサイズが0になることがあることがわかります。