Quando o kernel está contaminado, significa que ele está em um estado que não é suportado pela comunidade . A maioria dos desenvolvedores de kernel ignora os relatórios de erros que envolvem kernels contaminados, e os membros da comunidade podem solicitar que você corrija a condição de contaminação antes de prosseguir com o diagnóstico de problemas relacionados ao kernel. Além disso, algumas funcionalidades de depuração e chamadas de API podem ser desativadas quando o kernel está contaminado.
Na maioria dos casos, envolvendo drivers proprietários, você pode ignorar com segurança a condição de contaminação , mas alguns cenários que causam a contaminação do kernel podem ser indicativos de sérios problemas no sistema.
O recurso tem como objetivo identificar condições que podem dificultar a solução adequada de um problema no kernel. Por exemplo, o carregamento de um módulo proprietário pode tornar a saída de depuração do kernel não confiável, porque os desenvolvedores do kernel não têm acesso ao código fonte do módulo e, portanto, não podem determinar o que o módulo pode ter feito com o kernel. Da mesma forma, se o kernel já havia experimentado uma condição de erro ou se ocorreu um erro grave de hardware, as informações de depuração geradas pelo kernel podem não ser confiáveis.
O kernel pode ficar contaminado por vários motivos , incluindo (mas não limitado a) o seguinte:
- O uso de um módulo de kernel proprietário (ou não compatível com GPL) - essa é a causa mais comum de kernels contaminados e geralmente resulta do carregamento de drivers de vídeo NVIDIA ou AMD proprietários
- O uso de drivers temporários , que fazem parte do código-fonte do kernel, mas não são totalmente testados
- O uso de módulos fora da árvore que não estão incluídos no código-fonte do kernel do Linux
- Carregamento ou descarregamento forçado de um módulo do kernel (como inserir à força um módulo não criado para a versão atual do kernel)
- O uso de um kernel SMP (multiprocessador) em certas CPUs não processadas, sem suporte ao processador, principalmente os processadores AMD Athlon mais antigos
- Substituição do DSPI da ACPI , às vezes necessário para corrigir os erros de gerenciamento de energia (veja aqui para detalhes)
- Certas condições críticas de erro, como exceções de verificação da máquina e oopses do kernel
- Certos erros sérios no firmware do sistema (BIOS, UEFI) que o kernel deve solucionar
Cada uma dessas condições é representada por uma bandeira específica no kernel. Alguns fornecedores de Linux, como o SUSE, adicionam sinalizadores de contaminação adicionais para indicar condições, como carregar um módulo que não é suportado pelo fornecedor.
Mais informações estão disponíveis na documentação do kernel . Os sinalizadores de contaminação listados existem (com _ um substituto para 'em branco')
- G | P : G se todos os módulos carregados tiverem uma GPL ou licença compatível, caso contrário, um módulo proprietário foi carregado. Módulos sem um MODULE_LICENSE ou com um MODULE_LICENSE que não é reconhecido pelo insmod como compatível com GPL são considerados proprietários.
- F | _ : se algum módulo foi carregado com força por "insmod -f", caso contrário, se todos os módulos foram carregados normalmente.
- S | _ : se ocorrerem oops em um kernel SMP executando em hardware que não tenha sido certificado como seguro para executar o multiprocessador. Atualmente, isso ocorre apenas em vários Athlons que não são compatíveis com SMP.
- R | _ : se um módulo foi forçado a descarregar
rmmod -f
, caso contrário, se todos os módulos foram descarregados normalmente.
- M | _ : se algum processador relatou uma exceção de verificação de máquina , caso contrário, nenhuma exceção de verificação de máquina ocorreu.
- B | _ : se uma função de liberação de página encontrou uma referência de página incorreta ou alguns sinalizadores de página inesperados.
- U | _ : se um usuário ou aplicativo de usuário solicitou especificamente que o sinalizador contaminado fosse definido.
- D | _ : se o kernel morreu recentemente, ou seja, houve um OOPS ou BUG.
- A | _ : se a tabela ACPI foi substituída.
- W | _ : se um aviso tiver sido emitido anteriormente pelo kernel (embora alguns avisos possam definir sinalizadores de contaminação mais específicos).
- C | _ : se um driver temporário foi carregado.
- I | _ : se o kernel estiver trabalhando em torno de um bug grave no firmware da plataforma (BIOS ou similar).
- O | _ : se um módulo construído externamente ("fora da árvore") foi carregado.
- E | _ : se um módulo não assinado foi carregado em uma assinatura de módulo de suporte ao kernel.
- L | _ : se um bloqueio suave ocorreu anteriormente no sistema.
- K | _ : se o kernel foi corrigido ao vivo.