Quando il kernel è contaminato, significa che si trova in uno stato non supportato dalla community . La maggior parte degli sviluppatori del kernel ignorerà le segnalazioni di bug che coinvolgono kernel contaminati e i membri della comunità potrebbero chiederti di correggere la condizione di contaminazione prima di poter procedere con la diagnosi dei problemi relativi al kernel. Inoltre, alcune funzionalità di debug e chiamate API potrebbero essere disabilitate quando il kernel è contaminato.
Nella maggior parte dei casi che coinvolgono driver proprietari, puoi tranquillamente ignorare la condizione di contaminazione , ma alcuni scenari che causano la contaminazione del kernel possono essere indicativi di seri problemi di sistema.
La funzione ha lo scopo di identificare le condizioni che potrebbero rendere difficile la corretta risoluzione di un problema del kernel. Ad esempio, il caricamento di un modulo proprietario può rendere inaffidabile l'output di debug del kernel perché gli sviluppatori del kernel non hanno accesso al codice sorgente del modulo e quindi non possono determinare cosa il modulo potrebbe aver fatto al kernel. Allo stesso modo, se il kernel aveva precedentemente riscontrato una condizione di errore o se si era verificato un grave errore hardware, le informazioni di debug generate dal kernel potrebbero non essere affidabili.
Il kernel può essere contaminato per diversi motivi , incluso (ma non limitato a) quanto segue:
- L'uso di un modulo kernel proprietario (o non compatibile con GPL):questa è la causa più comune di kernel contaminati e di solito deriva dal caricamento di driver video proprietari NVIDIA o AMD
- L'uso della messa in scena driver, che fanno parte del codice sorgente del kernel ma non sono stati completamente testati
- L'uso di fuori dall'albero moduli che non sono inclusi nel codice sorgente del kernel Linux
- Caricamento o scaricamento forzato di un modulo del kernel (come l'inserimento forzato di un modulo non compilato per la versione corrente del kernel)
- L'uso di un kernel SMP (multiprocessore) su determinate CPU uniprocessore non supportate, principalmente processori AMD Athlon meno recenti
- Override dell'ACPI DSDT, a volte necessario per correggere i bug di gestione dell'alimentazione (vedi qui per i dettagli)
- Alcune condizioni di errore critico, come le eccezioni del controllo della macchina e gli oops del kernel
- Alcuni gravi bug nel firmware di sistema (BIOS, UEFI) che il kernel deve aggirare
Ognuna di queste condizioni è rappresentata da un particolare flag nel kernel. Alcuni fornitori di Linux, come SUSE, aggiungono flag di contaminazione aggiuntivi per indicare condizioni come il caricamento di un modulo che non è supportato dal fornitore.
Ulteriori informazioni sono disponibili nella documentazione del kernel. I flag di contaminazione qui elencati sono (con _ un sostituto di 'blank')
- G|P :G se tutti i moduli caricati hanno una licenza GPL o compatibile, altrimenti è stato caricato un modulo proprietario. I moduli senza MODULE_LICENSE o con una MODULE_LICENSE che non è riconosciuta da insmod come compatibile con GPL sono considerati proprietari.
- F|_ :se un modulo è stato caricato forzatamente da "insmod -f" altrimenti se tutti i moduli sono stati caricati normalmente.
- S|_ :se gli oops si sono verificati su un kernel SMP in esecuzione su hardware che non è stato certificato come sicuro per l'esecuzione multiprocessore. Attualmente ciò si verifica solo su vari Athlon che non supportano SMP.
- R|_ :se un modulo è stato scaricato forzatamente da
rmmod -f
, altrimenti se tutti i moduli sono stati scaricati normalmente. - M|_ :se un processore ha segnalato un'eccezione di controllo della macchina, altrimenti non si sono verificate eccezioni di controllo della macchina.
- B|_ :se una funzione di rilascio della pagina ha trovato un riferimento di pagina errato o alcuni flag di pagina imprevisti.
- U|_ :se un utente o un'applicazione utente ha richiesto specificamente l'impostazione del flag Tainted.
- D|_ :se il kernel è morto di recente, cioè c'era un OOPS o un BUG.
- A|_ :se la tabella ACPI è stata sovrascritta.
- W|_ :se in precedenza è stato emesso un avviso dal kernel (sebbene alcuni avvisi possano impostare flag di contaminazione più specifici.)
- C|_ :se è stato caricato un driver di staging.
- Io|_ :se il kernel sta aggirando un grave bug nel firmware della piattaforma (BIOS o simili).
- O|_ :se è stato caricato un modulo costruito esternamente ("out-of-tree").
- E|_ :se un modulo non firmato è stato caricato in un kernel che supporta la firma del modulo.
- L|_ :se si è precedentemente verificato un soft lockup sul sistema.
- K|_ :se il kernel è stato patchato in tempo reale.