カーネルが汚染されている場合、それはコミュニティによってサポートされていない状態にあることを意味します。ほとんどのカーネル開発者は、汚染されたカーネルに関連するバグレポートを無視し、コミュニティメンバーは、カーネルに関連する問題の診断に進む前に汚染状態を修正するように依頼する場合があります。さらに、カーネルが汚染されると、一部のデバッグ機能とAPI呼び出しが無効になる場合があります。
プロプライエタリドライバーを含むほとんどの場合、汚染状態を安全に無視できますが、カーネルが汚染される原因となるいくつかのシナリオは、深刻なシステム問題を示している可能性があります。
この機能は、カーネルの問題の適切なトラブルシューティングを困難にする可能性のある状態を識別することを目的としています。たとえば、独自のモジュールをロードすると、カーネル開発者はモジュールのソースコードにアクセスできず、したがってモジュールがカーネルに対して行った処理を判断できないため、カーネルデバッグ出力が信頼できなくなります。同様に、カーネルで以前にエラー状態が発生した場合、または重大なハードウェアエラーが発生した場合、カーネルによって生成されたデバッグ情報は信頼できない場合があります。
カーネルは、次のような(ただしこれらに限定されない)いくつかの理由のいずれかで汚染される可能性があります。
- プロプライエタリ(またはGPL非互換)カーネルモジュールの使用-これは汚染されたカーネルの最も一般的な原因であり、通常はプロプライエタリNVIDIAまたはAMDビデオドライバをロードした結果です。
- カーネルソースコードの一部であるが完全にはテストされていないステージングドライバーの使用
- Linuxカーネルソースコードに含まれていないツリー外モジュールの使用
- カーネルモジュールの強制的なロードまたはアンロード(現在のバージョンのカーネル用にビルドされていないモジュールを強制的に挿入するなど)
- サポートされていない特定のユニプロセッサーCPU、主に古いAMD AthlonプロセッサーでのSMP(マルチプロセッサー)カーネルの使用
- 電源管理のバグを修正するために必要になることがあるACPI DSDTのオーバーライド(詳細については、こちらを参照)
- マシンチェック例外やカーネルoopsesなどの特定の重大なエラー状態
- カーネルが回避する必要があるシステムファームウェア(BIOS、UEFI)の特定の重大なバグ
これらの各条件は、カーネル内の特定のフラグで表されます。SUSEなどの一部のLinuxベンダーは、追加の汚染フラグを追加して、ベンダーがサポートしていないモジュールのロードなどの状態を示します。
詳細については、カーネルのドキュメントを参照してください。そこにリストされている汚染フラグは(_で「空白」の代用)
- G | P:ロードされたすべてのモジュールにGPLまたは互換性のあるライセンスがある場合はG、それ以外の場合は独自のモジュールがロードされています。MODULE_LICENSEのないモジュール、またはinsmodによってGPL互換として認識されないMODULE_LICENSEのあるモジュールは、所有権があると見なされます。
- F | _:いずれかのモジュールが「insmod -f」によって強制ロードされた場合。そうでない場合、すべてのモジュールが正常にロードされた場合。
- S | _:マルチプロセッサを実行しても安全であると認定されていないハードウェアで実行されているSMPカーネルでoopsが発生した場合。現在、これはSMPに対応していないさまざまなAthlonでのみ発生します。
- R | _:モジュールがによって強制的にアンロードされた
rmmod -f
場合、そうでない場合、すべてのモジュールが正常にアンロードされた場合。
- M | _:プロセッサがMachine Check Exceptionを報告した場合、そうでない場合、Machine Check Exceptionは発生していません。
- B | _:ページリリース関数が不正なページ参照または予期しないページフラグを検出した場合。
- U | _:ユーザーまたはユーザーアプリケーションが汚染フラグの設定を明確に要求した場合。
- D | _:カーネルが最近死んだ、つまりOOPSまたはBUG があった場合。
- A | _:ACPIテーブルがオーバーライドされている場合。
- W | _:カーネルによって以前に警告が発行されている場合(警告によっては、より具体的な汚染フラグが設定される場合があります)
- C | _:ステージングドライバーがロードされている場合。
- I | _:カーネルがプラットフォームファームウェア(BIOSなど)の重大なバグを回避している場合。
- O | _:外部ビルド(「ツリー外」)モジュールがロードされている場合。
- E | _:モジュール署名をサポートするカーネルに未署名のモジュールがロードされている場合。
- L | _:ソフトロックアップが以前にシステムで発生した場合。
- K | _:カーネルにライブパッチが適用されている場合。