printk ()
La función de impresión del núcleo printk()
, se comporta casi de manera idéntica a la printf()
función de la biblioteca C. De hecho, a lo largo de este libro no hemos utilizado ninguna diferencia real. Para la mayoría de las intenciones, esto está bien; printk()
es simplemente el nombre de la función de impresión formateada del núcleo. Sin embargo, tiene algunas diferencias.
La robustez de printk ()
Una propiedad que printk()
se da por sentado rápidamente es su robustez. La printk()
función se puede llamar desde casi cualquier parte del núcleo en cualquier momento. Se puede invocar desde el contexto de interrupción o proceso. Se puede invocar mientras se mantiene un bloqueo. Se puede invocar simultáneamente en múltiples procesadores, sin embargo, no requiere que la persona que llama mantenga un bloqueo.
Es una función resistente. Esto es importante porque la utilidad de esto se printk()
basa en el hecho de que siempre está ahí y siempre funciona.
La no robustez de printk ()
Existe una grieta en la armadura de printk()
la robustez. Es inutilizable antes de un cierto punto en el proceso de arranque del kernel, antes de la inicialización de la consola. De hecho, si la consola no se inicializa, ¿a dónde se supone que debe ir la salida?
Esto normalmente no es un problema, a menos que esté depurando problemas muy temprano en el proceso de arranque (por ejemplo, en setup_arch()
, que realiza una inicialización específica de la arquitectura). Para empezar, dicha depuración es un desafío, y la ausencia de cualquier tipo de método de impresión solo agrava el problema.
Hay algo de esperanza, pero no mucha. Los piratas informáticos de arquitectura hardcore utilizan el hardware que funciona (por ejemplo, un puerto serie) para comunicarse con el mundo exterior. Confía en mí, esto no es divertido para la mayoría de las personas. Algunas arquitecturas compatibles implementan una solución sensata, sin embargo, y otras (incluido i386) tienen parches disponibles que también salvan el día.
La solución es una printk()
salida de lata variante que a la consola muy temprano en el proceso de arranque: early_printk()
. El comportamiento es el mismo printk()
, solo se cambia el nombre y su capacidad para trabajar antes. Sin embargo, esta no es una solución portátil, ya que no todas las arquitecturas compatibles tienen dicho método implementado. Sin embargo, podría convertirse en tu mejor amigo, si lo hace.
A menos que necesite escribir en la consola muy temprano en el proceso de arranque, puede confiar en printk()
que siempre funcionará.