printk es una función de C de la interfaz del kernel de Linux que imprime mensajes en el registro del kernel. [1] Acepta un parámetro de cadena llamado cadena de formato , que especifica un método para convertir un número arbitrario de parámetros de tipo de datos variados en una cadena. [1] La cadena se imprime luego en el registro del kernel. [1]
Proporciona una printf
abstracción similar a la de y su análisis de la cadena de formato y los argumentos se comportan de manera similar printf
. [1] Actúa como una herramienta de depuración para los programadores del kernel que necesitan esta función para registrar mensajes desde el kernel. [1]
El printk
prototipo de función es:
int printk ( const char * fmt , ...);
La biblioteca estándar C y su printf
función no están disponibles en modo kernel, de ahí la necesidad de printk
. [2]
Diferencias de printf
La función printk
se basa en printf
, pero no siempre se puede utilizar de la misma forma que printf
se utiliza. [1]
Niveles de registro
printk
permite a la persona que llama especificar el tipo y la importancia del mensaje que se envía. [1] Este especificador se denomina nivel de registro. [1]
El nivel de registro especifica el tipo de mensaje que se envía al registro de mensajes del kernel. [1] El nivel de registro se especifica anteponiendo (utilizando la concatenación literal de cadena de C ) una cadena que describe el nivel de registro al comienzo del mensaje que se va a producir. [1] Por ejemplo, un mensaje podría producirse KERN_INFO
utilizando lo siguiente: [1]
printk ( KERN_INFO "Mensaje:% s \ n " , arg );
La cadena que especifica el nivel de registro consiste en el comienzo ASCII del carácter de encabezado seguido de un dígito que describe el nivel de registro o el carácter 'c' para indicar que el mensaje es una continuación del mensaje anterior. [1] [3] Los siguientes niveles de registro, junto con sus interpretaciones, se dan a continuación. [4]
0 | KERN_EMERG | Una condición de emergencia; el sistema probablemente esté muerto |
1 | KERN_ALERT | Un problema que requiere atención inmediata |
2 | KERN_CRIT | Una condición crítica |
3 | KERN_ERR | Un error |
4 | KERN_WARNING | Una advertencia |
5 | KERN_NOTICE | Una condición normal, pero quizás digna de mención |
6 | KERN_INFO | Un mensaje informativo |
7 | KERN_DEBUG | Un mensaje de depuración, normalmente superfluo |
Cuando no se especifica un nivel de registro, el nivel de registro predeterminado es KERN_WARNING
, [1] a menos que un valor predeterminado diferente ha sido ajustada en el propio núcleo [ cita requerida ] .
Los niveles de registro se definen en
. [3] Los niveles de registro que se imprimen se configuran mediante el archivo sysctl/proc/sys/kernel/printk
. [1]
Formatos de puntero
El %p
especificador de formato (utilizado para imprimir punteros en printf
) se amplía para agregar modos de formato adicionales, por ejemplo, solicitar imprimir un struct sockaddr *
uso %pISpc
imprimiría una dirección IPv4 / v6 y un puerto en un formato amigable para los humanos (por ejemplo, "1.2.3.4:12345" o "[1: 2: 3: 4: 5: 6: 7: 8]: 12345"). [5]
Sin soporte de punto flotante
Si bien printf
admite la salida de números de punto flotante, printk
no lo hace, [5] ya que el kernel de Linux no usa números de punto flotante dentro del kernel. [6]
Descripción
La función intenta bloquear el semáforo que controla el acceso a la consola del sistema. [1] [7] Si tiene éxito, se registra la salida 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 suelte el semáforo de la consola y enviará la salida almacenada en búfer a la consola antes. soltando el semáforo. [1]
Un efecto de esta impresión diferida es que el código que llama printk
y luego cambia los niveles de registro que se van a imprimir puede romperse. Esto se debe a que el nivel de registro que se va a imprimir se inspecciona cuando se produce la impresión real. [1]
La función printk
se puede llamar desde cualquier parte del kernel, excepto durante las primeras etapas del proceso de arranque del kernel, cuando la consola del sistema no está inicializada. [4] La función alternativa early_printk
se implementa en algunas arquitecturas y se usa de manera idéntica printk
durante las primeras etapas del proceso de arranque. [4]
Referencias
- ^ a b c d e f g h i j k l m n o p q r "Registro de mensajes con printk - La documentación del kernel de Linux" . www.kernel.org . Consultado el 9 de septiembre de 2020 .
- ^ ISO / IEC 9899: 2018 . Organización de Estándares Internacionales. 2018.
- ^ a b "kern_levels.h" . GitHub . Consultado el 9 de septiembre de 2020 .
- ^ a b c "printk ()" . archive.is . 2007-08-30 . Consultado el 9 de septiembre de 2020 .
- ^ a b "Cómo obtener los especificadores de formato de printk correctos - La documentación del Kernel de Linux" . www.kernel.org . Consultado el 9 de septiembre de 2020 .
- ^ "Re: kernel de Linux y punto flotante" . www.redhat.com . Consultado el 9 de septiembre de 2020 .
- ^ "Conceptos básicos del controlador: la documentación del kernel de Linux" . www.kernel.org . Consultado el 9 de septiembre de 2020 .
enlaces externos
- Referencia de formato