Un pánico del núcleo (a veces abreviado como KP [1] ) es una medida de seguridad que toma el núcleo 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 de datos importante. El término es en gran medida específico de los sistemas Unix y similares . 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 núcleo que manejan los pánicos, conocidas como panic()
en el código fuente de 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 núcleo al disco para la depuración post-mortem y luego esperar a que el sistema se reinicie 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 núcleo también pueden ser causados por errores que se originan fuera del espacio del núcleo . Por ejemplo, muchos sistemas operativos Unix entran en pánico si el proceso init , que se ejecuta en el espacio del usuario , finaliza. [3] [4]
El núcleo de Unix mantiene la consistencia interna y la corrección en 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 un fallo en una aserción da como resultado un pánico , es decir, una detención voluntaria de toda la actividad del sistema. [5] El pánico del núcleo 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 de 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. Él dijo: "Omitimos todo eso. Si hay un error, tenemos esta rutina llamada pánico, y cuando se llama, la máquina se bloquea y gritas desde el pasillo: 'Oye, reiníciala ' " . [6]
La panic()
función original no sufrió modificaciones sustanciales desde la quinta edición de UNIX hasta el UNIX 32V basado en VAX y solo generaba un mensaje de error sin ninguna otra información, lo que hacía que el sistema cayera en un bucle inactivo sin fin.
Código fuente de panic()
la función en UNIX V6 : [7]
/* * En caso de que la consola esté apagada, * panicstr contiene el argumento de la última * llamada a panic. */ char * panicstr ; /* * Se llama a Panic en caso de errores fatales irresolubles. * Se sincroniza, imprime "panic: mesg" y * luego realiza un bucle. */ panic ( s ) char * s ; { panicstr = s ; update (); printf ( "panic: %s \n " , s ); for (;;) idle (); }
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.
Un pánico puede ocurrir 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 continuar funcionando después de que se haya producido un error. Si el sistema está en un estado inestable, en lugar de correr el riesgo de sufrir violaciones de seguridad y corrupción de datos, el sistema operativo se detiene para evitar más daños, lo que ayuda a facilitar el diagnóstico del error y puede reiniciarse automáticamente. [8]
Después de volver a compilar una imagen binaria del núcleo a partir del código fuente , un pánico del núcleo mientras se inicia el núcleo resultante es un problema común si el núcleo no se configuró, compiló o instaló correctamente. [9] El hardware adicional o el mal funcionamiento de la RAM también podrían ser fuentes de errores fatales del núcleo durante el inicio, debido a la incompatibilidad con el sistema operativo o la falta de un controlador de dispositivo . [10] Un núcleo también puede entrar en pánico 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 núcleo , normalmente se activa un pánico si falla el engendro de init . También se puede activar un pánico si el proceso init termina, 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]
int estático __ref kernel_init ( void * no utilizado ) { ... /* * Probamos cada uno de estos hasta que uno tenga éxito. * * Se puede usar el shell Bourne en lugar de init si estamos * tratando de recuperar una máquina realmente rota. */ if ( execute_command ) { if ( ! run_init_process ( execute_command )) return 0 ; pr_err ( "Error al ejecutar %s. Intentando valores predeterminados... \n " , execute_command ); } if ( ! run_init_process ( "/sbin/init" ) || ! run_init_process ( " /etc/init " ) || ! run_init_process ( "/bin /init" ) || ! run_init_process ( "/bin/sh" )) return 0 ; panic ( "No se encontró init. Intente pasar la opción init= al kernel. " "Consulte Linux Documentation/init.txt para obtener orientación." ); }
Los pánicos del kernel aparecen en Linux como en otros sistemas similares a Unix ; sin embargo, errores graves pero no fatales pueden generar otro tipo de condición de error, conocida como un error del kernel . [14] En este caso, el kernel normalmente continúa ejecutándose después de matar el proceso ofensivo . Como un error puede hacer que algunos subsistemas o recursos no estén disponibles, más tarde puede conducir a un pánico del kernel completo.
En Linux, un pánico del kernel hace que los LED del teclado parpadeen como una indicación visual de una condición crítica. [15]
Cuando se produce un pánico del núcleo en Mac OS X 10.2 a 10.7, el equipo muestra un mensaje multilingüe que informa al usuario de que debe 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 la versión 10.8 y posteriores, el equipo se reinicia automáticamente y el mensaje solo se muestra como una advertencia que se puede omitir después. El formato del mensaje varía de una versión a otra: [17]
Si ocurren cinco nuevos pánicos del kernel dentro de los tres minutos siguientes al primero, el Mac mostrará un signo de prohibición durante treinta segundos y luego se apagará; esto se conoce como "pánico del kernel recurrente". [18]
En todas las versiones posteriores a la 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 la NVRAM y se escribe en un archivo de registro al reiniciar. En la versión 10.7 hay una función para reiniciar automáticamente después de un pánico del núcleo. En algunos casos, en la versión 10.2 y posteriores, puede aparecer un texto blanco que detalla el error además del símbolo de espera.