Um kernel panic do Linux é uma chamada de subrotina que o kernel executa quando a lógica do kernel determina que existe uma condição que torna a execução continuada da lógica normal impossível ou irresponsável.
O kernel pode chamar um pânico quando:
- Detecta um erro de software no código do kernel ou na pilha
- Quando há uma condição de tempo de execução, como falta de memória, sem processos elimináveis
- Uma exceção de CPU durante a execução no modo privilegiado resulta em uma condição oops
Existem cerca de 950 condições distintas em que um pânico é chamado nos kernels 3.X. A sub-rotina de pânico primeiro imprime o despejo de pilha do kernel e os registradores da CPU no console. Então, se um crash kexec kernel foi configurado, ele inicializa o kernel kexec. Caso contrário, a rotina de pânico quebra todos os spinlocks e realiza uma reinicialização de emergência.
Um oops é uma sub-rotina chamada de um manipulador de exceção de CPU para uma exceção de CPU que ocorre durante a execução no modo privilegiado (ou seja, no kernel). A exceção pode ocorrer como resultado de um erro no código do kernel ou devido a uma falha de hardware ou como resultado de uma condição externa que causa uma exceção específica. O manipulador para a exceção imprime um log do kernel com registros de CPU e lista de módulos. Ao contrário das chamadas de pânico, a própria lógica do kernel nunca chama um oops fora do contexto dos manipuladores de exceção da CPU.
Se o kernel estiver configurado para kexec, então oops resultará no kernel kexec sendo inicializado. Caso contrário, se a exceção ocorrer durante a execução de um manipulador de interrupção, o oops resultará em uma chamada de pânico do kernel. Caso contrário, se o kernel estiver configurado com “panic on oops”, o oops resultará em uma chamada de pânico. Caso contrário, o kernel sai do manipulador de exceções e retoma a execução. Quando o kernel sai do manipulador de exceção e continua a execução, a integridade do kernel é suspeita.
Os manipuladores de exceções da CPU são específicos da arquitetura. Eles geralmente são implementados em arch / * / kernel / traps.c, e são configurados no código de entrada do kernel específico da arquitetura que configura a tabela de interrupções. Veja por exemplo arch/powerpc/kernel/traps.c
e arch/powerpc/kernel/head_fsl_booke.S
.
As condições de kernel panic e oops podem ser configuradas para chamar uma rotina kmsg_dump
que você pode usar para salvar informações de depuração de falha na memória RAM, ou a memória flash, a menos que o oops ocorra em contexto de interrupção, caso em que o “kmsg_dump” rotina só pode ser usada para salvar em RAM, não em MTD. Ao salvar na RAM, é sua responsabilidade a) garantir que a área de RAM usada não seja sobrescrita durante a inicialização do kexec ou do reinício de emergência, e b) coletar a área de memória do kernel kexec ou da lógica do carregador de inicialização.