これは、人々がなぜ他のものを使用することを選ぶのかについての現在の理解です。私を確認または修正していただけますか?
- ランタイムとコンパイル時間:実行時にこの機能を有効にするかどうかわからない場合は、tristateを使用してください。それ以外の場合はコンパイル時にわかりますので、boolを使用してください。一部の周辺コードBに一部のオプションのコードAが含まれている場合(たとえば、GPUサポートなどの追加機能を含めるために)、モジュールB全体がトライステートで宣言されていて
#ifdef
も、Aをboolに設定する必要があります。ifdef
コンパイル時に完了します。 - 繰り返し速度:新しいコードを開発する場合は、それをモジュールとして宣言すると、システム全体を再起動せずに、以前のバージョンをすばやくアンロードし、新しくコンパイルされたバージョンを再ロードできます。
- 侵入性:すでに実行されているコア(たとえば、対称マルチプロセッシング)に動的に追加された一部のコードは破壊的であるため、常にブールです。
ここに私が逃した他の要素はありますか?私が逃した要素はおそらく
- パフォーマンス
- 安全
- 経験則(たとえば、次の場合以外は常にboolを使用してください。必要三国志を使う」)
他の説明、メモ、リンク、アイデアを提供していただきありがとうございます。ありがとうございます!
答え1
引用https://www.linuxjournal.com/content/kbuild-linux-kernel-build-system
カーネル内のすべての項目をモジュールにコンパイルすることはできません。
多くの機能は邪魔になりすぎるため、コンパイル時にカーネルがその機能をサポートしているかどうかを判断する必要があります。たとえば、実行中のカーネルに対称的多重処理(SMP)またはカーネルプリエンプションサポートを追加することはできません。したがって、ブール構成表記の使用は、このタイプの機能に適しています。
モジュールでコンパイルできるほとんどの機能は、コンパイル時にカーネルに追加することもできます。これが、組み込み関数をコンパイルするか(y)、モジュールにコンパイルするか(m)、まったくコンパイルしないか(n)を決定するための3状態記号が存在する理由です。
これは明らかだと思います。選択肢が2つだけの場合はブール値を使用し、選択肢が3つの場合はtristateを使用します。他のすべては意味がありません。