c linux linux-kernel system-calls printk

Linux-kernel: printk desde "abierto" syscall no funciona



system-calls (2)

Tengo una duda.

Abrí el kernel y cambié el directorio linux-3.1.1 / fs / open.c

Cambié el código de seguimiento en open.c.

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode) { long ret; printk(KERN_EMERG "Testing/n"); ... }

Puse esta línea solamente: printk(KERN_EMERG "Testing");

E <linux/kernel.h> las bibliotecas: <linux/kernel.h> y <linux/printk.h>

Así que compilé y reinicié mi Linux (Ubuntu). Durante el reinicio apareció una gran cantidad de "Pruebas" en la pantalla. Así que hasta ahora está bien.

Pero ahora tengo un problema. Creé este programa en c.

int main() { size_t filedesc = open("testefile2.txt",O_CREAT | O_WRONLY,0640); printf("%d",filedesc); }

Recopilé este programa y lo ejecuté y funciona bien. Pero no entiendo por qué la "Prueba" no apareció en el caparazón. Quiero decir, si cuando reinicio la PC apareció una gran parte de la palabra "Testing", ¿por qué esta palabra no aparece cuando ejecuto el programa anterior? Solo para agregar, incluyo estas bibliotecas en este código de arriba:

unistd.h , fcntl.h , stdio.h , stdlib.h

Gracias chicos.


Las llamadas de impresión aparecen en el búfer de mensajes del kernel, no en su proceso ''stdout / stderr


Pero no entiendo por qué la "Prueba" no apareció en el caparazón.

Creo que este es el efecto de la supresión de mensajes de Printk. (más exactamente: limitación de velocidad )

Verifique el registro de mensajes o la consola para

printk: ### messages suppressed.

cuerda.

Esta función dejará de imprimir un mensaje, si hubo muchos mensajes recientemente.

El código real es como Kernel 3.1: http://lxr.linux.no/#linux+v3.1.1/kernel/printk.c#L1621

1621 * printk rate limiting, lifted from the networking subsystem. 1622 * 1623 * This enforces a rate limit: not more than 10 kernel messages 1624 * every 5s to make a denial-of-service attack impossible. 1625 */ 1626 DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10); 1627 1628 int __printk_ratelimit(const char *func)

Entonces, como el syscall open es muy popular (solo haga un strace -e open /bin/ls - tendré 15 syscalls open para simplemente iniciar un ls simple), la limitación de velocidad estará en efecto. Limitará su mensaje para que se imprima solo una vez en 5 segundos; no más de 10 mensajes en "ráfaga" individual.

Solo puedo sugerir crear un usuario especial con UID conocido y agregar una verificación de UID antes de printk en el código printk-in-open adicional.