2016-08-08 41 views
0

ich kleine Kernelmodul-Code geschrieben, wie unten erwähnt, ich mich entschieden jetzt in ubuntu 14.04Warum printk Nachricht nicht im Kernel-Log kann nicht gedruckt werden (dmesg)

#include <linux/module.h> 
#include <linux/version.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 

int init_mod_func(void) 
{ 
    printk(KERN_INFO "My module inserted\n "); 
    return 0; 
} 

void cleanup_mod_func(void) 
{ 
    printk(KERN_INFO "My module removed\n "); 
} 

module_init(init_mod_func); 
module_exit(cleanup_mod_func); 


MODULE_AUTHOR("Ankur"); 
MODULE_DESCRIPTION("TEST MODULE"); 
MODULE_LICENSE("GPL"); 

, wenn ich oben Modul kompilieren und legen insmod mit Ich sehe keine printk-Nachricht im dmesg. Nach dem Entfernen des Moduls mit rmmod sehe ich jedoch beide printk-Nachrichten.

Mit Verschluss aussehen, fand ich heraus, dass es wegen space nach \n in der printk geschieht.
Allerdings verstehe ich nicht, warum es so ist.

ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo dmesg -C /dev/null 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo insmod testmod.ko 
ankur:~/temp/tmp$ dmesg 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo rmmod testmod 
ankur:~/temp/tmp$ dmesg 
[ 4062.140441] My module inserted 
[ 4062.140441] 
[ 4073.324994] My module removed 
[ 4073.324994] 
+0

warum downvoted? :( – AnkurTank

Antwort

3

Der Kernel-Log-Ringpuffer verhält, als ob es Line-gepuffert wurde, wie es bei der Umsetzung zu sehen ist:

  • in vprintk_emit Sie können sehen, wie sie einen Puffer markiert gespült werden/auf die Existenz eines newline gepufferte Basis

  • in log_output Sie den eigentlichen Code sehen, die Pflege Spülung nimmt oder Puffern der Nachricht

Offensichtlich enthalten Ihre Nachrichten keine abschließenden Zeilenumbrüche. Hätten Sie das nachgestellte Leerzeichen gelöscht, würden Sie die Nachrichten im Kernelprotokoll sehen, nachdem sie in den printk-Aufruf (en) geleert wurden.

+0

Vielen Dank für die Antwort, Gibt es eine Möglichkeit, Puffer außerhalb des Codes zu leeren. ZB wenn Sie Treiber debuggen und keine Nachrichten von 'printk' sehen, können wir Puffer Flush von der Kommandozeile auslösen? – AnkurTank

+0

Nicht explizit, aber Aufrufe an "[v] printk" oder "printk_defered" können die Nachrichten Ihres eigenen Moduls ebenfalls löschen. Wie der Kommentar in Zeile 1724 sagt "Ein früherer Zeilenumbruch fehlte oder eine andere Aufgabe druckt auch Fortsetzungszeilen ...". –