Cuando el núcleo está contaminado, significa que está en un estado que no es compatible con la comunidad . La mayoría de los desarrolladores de kernel ignorarán los informes de errores que involucran kernels contaminados, y los miembros de la comunidad pueden pedirle que corrija la condición de contaminación antes de que puedan proceder a diagnosticar problemas relacionados con el kernel. Además, algunas funciones de depuración y llamadas de API pueden deshabilitarse cuando el núcleo está contaminado.
En la mayoría de los casos que involucran controladores propietarios, puede ignorar de forma segura la condición de contaminación , pero algunos escenarios que hacen que el núcleo se contamine pueden indicar problemas serios del sistema.
La función está destinada a identificar condiciones que pueden dificultar la solución adecuada de un problema del núcleo. Por ejemplo, la carga de un módulo propietario puede hacer que la salida de depuración del kernel no sea confiable porque los desarrolladores del kernel no tienen acceso al código fuente del módulo y, por lo tanto, no pueden determinar qué puede haber hecho el módulo al kernel. Del mismo modo, si el núcleo había experimentado previamente una condición de error o si se había producido un error grave de hardware, la información de depuración generada por el núcleo puede no ser confiable.
El kernel puede contaminarse por cualquiera de varias razones , que incluyen (entre otras) las siguientes:
- El uso de un módulo de kernel patentado (o no compatible con GPL): esta es la causa más común de kernels contaminados y generalmente es el resultado de cargar controladores de video NVIDIA o AMD patentados
- El uso de controladores provisionales , que son parte del código fuente del núcleo pero no están completamente probados
- El uso de módulos fuera del árbol que no están incluidos con el código fuente del kernel de Linux
- Carga o descarga forzada de un módulo de kernel (como insertar a la fuerza un módulo no construido para la versión actual del kernel)
- El uso de un núcleo SMP (multiprocesador) en ciertas CPU de un solo procesador no compatibles, principalmente procesadores AMD Athlon más antiguos
- Anulación del DSDT de ACPI , a veces es necesario corregir los errores de administración de energía (consulte aquí para más detalles)
- Ciertas condiciones de error crítico, como excepciones de comprobación de máquina y ups de kernel
- Ciertos errores graves en el firmware del sistema (BIOS, UEFI) que el núcleo debe solucionar
Cada una de estas condiciones está representada por una bandera particular en el núcleo. Algunos proveedores de Linux, como SUSE, agregan indicadores de contaminación adicionales para indicar condiciones como la carga de un módulo que no es compatible con el proveedor.
Hay más información disponible en la documentación del kernel . Las banderas de contaminación enumeradas allí son (con _ un sustituto para 'en blanco')
- G | P : G si todos los módulos cargados tienen una licencia GPL o compatible, de lo contrario, se ha cargado un módulo propietario. Se supone que los módulos sin MODULE_LICENSE o con MODULE_LICENSE que no reconoce insmod como compatibles con GPL son propietarios.
- F | _ : si algún módulo fue forzado a cargar por "insmod -f", de lo contrario si todos los módulos se cargaron normalmente.
- S | _ : si se produjo el error en un núcleo SMP que se ejecuta en hardware que no ha sido certificado como seguro para ejecutar multiprocesador. Actualmente esto ocurre solo en varios Athlons que no son compatibles con SMP.
- R | _ : si un módulo fue forzado a descargar
rmmod -f
, de lo contrario si todos los módulos se descargaron normalmente.
- M | _ : si algún procesador ha informado una excepción de verificación de máquina , de lo contrario no se han producido excepciones de verificación de máquina.
- B | _ : si una función de liberación de página ha encontrado una referencia de página incorrecta o algunos indicadores de página inesperados.
- U | _ : si un usuario o aplicación de usuario solicitó específicamente que se establezca el indicador Tainted.
- D | _ : si el núcleo ha muerto recientemente, es decir, hubo un OOPS o ERROR.
- A | _ : si la tabla ACPI ha sido anulada.
- W | _ : si el núcleo ha emitido previamente una advertencia (aunque algunas advertencias pueden establecer marcas de contaminación más específicas).
- C | _ : si se ha cargado un controlador provisional.
- I | _ : si el núcleo está solucionando un error grave en el firmware de la plataforma (BIOS o similar).
- O | _ : si se ha cargado un módulo construido externamente ("fuera del árbol").
- E | _ : si se ha cargado un módulo sin firmar en un núcleo que admite la firma del módulo.
- L | _ : si anteriormente se ha producido un bloqueo suave en el sistema.
- K | _ : si el kernel ha sido parcheado en vivo.