Articulo de referencia

printk

printk es unafunción similar a printf de la interfaz del kernel de Linux para formatear y escribir entradas de registro del kernel. [ 1 ] Dado que la biblioteca estándar de C (q...

printk es unafunción similar a printf de la interfaz del kernel de Linux para formatear y escribir entradas de registro del kernel. [ 1 ] Dado que la biblioteca estándar de C (que contiene las omnipresentes funciones similares a printf) no está disponible en el modo kernel ,printkproporciona una salida de propósito general en el kernel. [ 2 ] Debido a las limitaciones del diseño del kernel, la función se usa a menudo para ayudar a depurar software en modo kernel. [ 1 ]

printkSe puede llamar desde cualquier parte del kernel, excepto durante las primeras etapas del proceso de arranque, antes de que se inicialice la consola del sistema. [ 3 ] La función alternativa early_printkestá implementada en algunas arquitecturas y se usa de forma idéntica, printkpero durante las primeras etapas del proceso de arranque. [ 3 ]

Usar

printktiene la misma sintaxis que printf, pero una semántica algo diferente . Al igual que printf, printkacepta un argumento de cadena C de formato y una lista de argumentos de valor. [ 1 ] Ambos formatean texto en función de los parámetros de entrada y con un comportamiento significativamente similar, pero también existen diferencias significativas. [ 1 ] El prototipo de la función (que coincide con el de ) es:printkprintf

int printk ( const char * formato , ...);

Las características que lo diferencian printfse describen a continuación.

Nivel de registro

printkPermite al emisor especificar un nivel de registro : el tipo y la importancia del mensaje que se envía. El nivel se especifica anteponiendo un texto que lo identifica. Normalmente, el texto se antepone mediante la concatenación de literales de cadena de C y mediante una de las macros diseñadas para este fin. Por ejemplo, un mensaje podría registrarse en el nivel informativo como: [ 1 ]

printk ( KERN_INFO "Mensaje: %s" , arg )

El texto que especifica el nivel de registro consta del carácter ASCII SOH seguido de un dígito que identifica el nivel de registro o la letra 'c' para indicar que el mensaje es una continuación del mensaje anterior. [ 1 ] [ 4 ] La siguiente tabla enumera cada nivel de registro con su significado canónico. [ 3 ]

Cuando no se especifica ningún nivel de registro, la entrada se registra con el nivel predeterminado, que suele ser KERN_WARNING , [ 1 ] pero se puede configurar, por ejemplo, mediante el argumento de arranque loglevel= . [ 5 ]

Los niveles de registro se definen en el archivo de cabecera <linux/kern_levels.h> . [ 4 ] Los niveles de registro que se imprimen se configuran mediante el archivo sysctl /proc/sys/kernel/printk . [ 1 ]

Formatos de puntero

El %pespecificador de formato que admite printf, se extiende con modos de formato adicionales. Por ejemplo, solicitar que se imprima un struct sockaddr *usando %pISpcformatea una dirección IPv4/v6 y un puerto en un formato fácil de usar para humanos, como1.2.3.4:12345o[1:2:3:4:5:6:7:8]: 12345. [ 6 ]

Sin soporte para coma flotante

Aunque printfadmite el formato de números de punto flotante , printkno lo hace, [ 6 ] ya que el kernel de Linux no permite el uso de números de punto flotante en el código del kernel. (El uso de números de punto flotante requiere guardar y restaurar registros y banderas de estado adicionales en comparación con el código que solo admite enteros). [ 7 ]

Implementación

La función intenta bloquear el semáforo que controla el acceso a la consola del sistema Linux . [ 1 ] [ 8 ] Si tiene éxito, la salida se registra y se llaman los controladores de la consola. [ 1 ] Si no es posible adquirir el semáforo, la salida se coloca en el búfer de registro, y el poseedor actual del semáforo de la consola notará la nueva salida cuando lo libere y enviará la salida almacenada en el búfer a la consola antes de liberar el semáforo. [ 1 ]

Una consecuencia de esta impresión diferida es que el código que llama printky luego cambia los niveles de registro que se van a imprimir puede fallar. Esto se debe a que el nivel de registro que se va a imprimir se inspecciona cuando se produce la impresión real. [ 1 ]

Referencias

  1. 1 2 3 4 5 6 7 8 9 10 11 12 "Registro de mensajes con printk: la documentación del kernel de Linux" . www.kernel.org . Consultado el 9 de septiembre de 2020 .
  2. ISO/IEC 9899:2018 . Organización Internacional de Normalización. 2018.
  3. 1 2 3 "printk()" . archive.is . 30 de agosto de 2007. Archivado del original el 1 de febrero de 2012 . Recuperado el 9 de septiembre de 2020 .
  4. 1 2 "kern_levels.h" . GitHub . Consultado el 27 de septiembre de 2020 .
  5. "Parámetros de la línea de comandos del kernel" . kernel.org . Consultado el 27 de septiembre de 2023 .
  6. 1 2 "Cómo configurar correctamente los especificadores de formato printk — La documentación del kernel de Linux" . www.kernel.org . Consultado el 9 de septiembre de 2020 .
  7. "Re: Núcleo de Linux y punto flotante" . www.redhat.com . Archivado del original el 21 de julio de 2019. Consultado el 9 de septiembre de 2020 .
  8. "Conceptos básicos de controladores: la documentación del kernel de Linux" . www.kernel.org . Consultado el 9 de septiembre de 2020 .
  • Referencia del formato printk