Un pánico del kernel (a veces abreviado como KP [1] ) es una medida de seguridad que toma el kernel de un sistema operativo al detectar un error fatal interno en el que no puede recuperarse de manera segura o continuar ejecutando el sistema tendría un mayor riesgo. de pérdida importante de datos. El término es en gran medida específico de Unix y sistemas similares a Unix . El equivalente en los sistemas operativos Microsoft Windows es un error de detención , a menudo llamado "pantalla azul de la muerte".
Las rutinas del kernelpanic()
que manejan los pánicos, conocidas como código fuente Unix derivado de AT&T y BSD , generalmente están diseñadas para enviar un mensaje de error a la consola , volcar una imagen de la memoria del kernel al disco para una depuración post-mortem y luego esperar el sistema se reiniciará manualmente o iniciará un reinicio automático . [2] La información proporcionada es de naturaleza altamente técnica y tiene como objetivo ayudar a un administrador de sistemas o desarrollador de software a diagnosticar el problema. Los pánicos del kernel también pueden ser causados por errores que se originan fuera del espacio del kernel . Por ejemplo, muchos sistemas operativos Unix entran en pánico si finaliza el proceso de inicio , que se ejecuta en el espacio del usuario . [3] [4]
El kernel de Unix mantiene la coherencia interna y la corrección del tiempo de ejecución con aserciones como mecanismo de detección de fallas . La suposición básica es que el hardware y el software deben funcionar correctamente y que un fallo en una afirmación provoca pánico , es decir, una parada voluntaria de toda la actividad del sistema. [5] El pánico del kernel se introdujo en una versión temprana de Unix y demostró una diferencia importante entre las filosofías de diseño de Unix y su predecesor Multics . El desarrollador de Multics, Tom van Vleck, recuerda una discusión sobre este cambio con el desarrollador de Unix, Dennis Ritchie :
Le comenté a Dennis que fácilmente la mitad del código que estaba escribiendo en Multics era código de recuperación de errores. Dijo: "Omitimos todo eso. Si hay un error, tenemos esta rutina llamada pánico, y cuando se llama, la máquina falla y gritas en el pasillo: 'Oye, reiníciala ' " . ]
panic()
La función original se mantuvo esencialmente sin cambios desde la Quinta Edición de UNIX al UNIX 32V basado en VAX y solo generaba un mensaje de error sin otra información, luego dejaba el sistema en un bucle inactivo sin fin.
Código fuente de panic()
la función en V6 UNIX : [7]
/* * En caso de que la consola esté apagada, * pánicostr contiene el argumento para la última * llamada al pánico. */ char * pánicostr ; /* * Se invoca pánico ante errores fatales * irresolubles. * Se sincroniza, imprime "panic: mesg" y * luego realiza un bucle. */ pánico ( s ) char * s ; { cadena de pánico = s ; actualizar (); printf ( "pánico: %s \n " , s ); para (;;) inactivo (); }
A medida que se mejoró el código basepanic()
de Unix, también se mejoró la función para volcar varias formas de información de depuración a la consola.
Puede producirse un pánico como resultado de una falla de hardware o un error de software en el sistema operativo. En muchos casos, el sistema operativo es capaz de seguir funcionando después de que se ha producido un error. Sin embargo, el sistema se encuentra en un estado inestable y, en lugar de correr el riesgo de sufrir violaciones de seguridad y corrupción de datos, el sistema operativo se detiene para evitar daños mayores y facilitar el diagnóstico del error y, en los casos habituales, reiniciar. [8]
Después de recompilar una imagen binaria del kernel a partir del código fuente , un pánico en el kernel al arrancar el kernel resultante es un problema común si el kernel no se configuró, compiló o instaló correctamente. [9] El hardware adicional o la RAM que funciona mal también podrían ser fuentes de errores fatales del kernel durante el inicio, debido a la incompatibilidad con el sistema operativo o a la falta de un controlador de dispositivo . [10] Un kernel también puede entrar panic()
si no puede localizar un sistema de archivos raíz . [11] Durante las etapas finales de la inicialización del espacio de usuario del kernel , normalmente se desencadena un pánico si falla la generación de init . También se podría desencadenar un pánico si el proceso de inicio finaliza, ya que el sistema quedaría inutilizable. [12]
La siguiente es una implementación de la inicialización final del kernel de Linux en kernel_init()
: [13]
static int __ref kernel_init ( void * no utilizado ) { ... /* * Probamos cada uno de estos hasta que uno tenga éxito. * * El shell Bourne se puede utilizar en lugar de init si estamos * intentando recuperar una máquina realmente averiada. */ if ( ejecutar_comando ) { if ( ! run_init_process ( ejecutar_comando )) devolver 0 ; pr_err ( "Error al ejecutar %s. Intentando los valores predeterminados... \n " , ejecutar_command ); } if ( ! run_init_process ( "/sbin/init" ) || ! run_init_process ( "/etc/init" ) || ! run_init_process ( "/bin/init" ) || ! run_init_process ( "/bin/sh" )) devolver 0 ; pánico ( "No se encontró init. Intente pasar la opción init= al kernel. " "Consulte la documentación de Linux/init.txt para obtener orientación." ); }
Los pánicos del kernel aparecen en Linux como en otros sistemas similares a Unix , pero también pueden generar otro tipo de condición de error, conocida como kernel oops . [14] En este caso, el kernel normalmente continúa ejecutándose después de finalizar el proceso infractor . Como un Ups podría hacer que algunos subsistemas o recursos dejen de estar disponibles, más tarde pueden provocar un pánico total en el kernel.
En Linux, un pánico en el kernel hace que los LED del teclado parpadeen como indicación visual de una condición crítica. [15]
Cuando se produce un pánico en el kernel en Mac OS X 10.2 a 10.7, la computadora muestra un mensaje multilingüe que informa al usuario que necesita reiniciar el sistema. [16] Antes de la versión 10.2, se mostraba un mensaje de pánico más tradicional al estilo Unix; en 10.8 y posteriores, la computadora se reinicia automáticamente y muestra un mensaje después del reinicio. El formato del mensaje varía de una versión a otra: [17]
A veces, cuando hay cinco o más pánicos del kernel dentro de los tres minutos posteriores al primero, la Mac mostrará una señal de prohibición durante 30 segundos y luego se apagará; esto se conoce como "pánico recurrente del kernel". [18]
En todas las versiones superiores a 10.2, el texto se superpone a un símbolo de espera y no aparece en pantalla completa. La información de depuración se guarda en NVRAM y se escribe en un archivo de registro al reiniciar. En 10.7 hay una función para reiniciar automáticamente después de un pánico en el kernel. En algunos casos, en 10.2 y posteriores, puede aparecer un texto blanco que detalla el error además del símbolo de espera.