Ank*_*ank 5 c kernel kernel-module linux-kernel printk
我编写了如下所述的小型内核模块代码,我正在对其进行测试 ubuntu 14.04
#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");
Run Code Online (Sandbox Code Playgroud)
现在,当我使用上面的模块进行编译和插入时insmod,在dmesg中看不到printk消息。但是,在使用模块删除后,rmmod我看到了两个printk消息。
通过闭包外观,我发现它是由于在printk中出现spaceafter \n而引起的。
但是我不明白为什么会这样。
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]
Run Code Online (Sandbox Code Playgroud)
从实现中可以看出,内核日志环形缓冲区的行为就像是行缓冲一样:
在vprintk_emit你可以看到它标志着一个缓冲区被刷新/缓冲的基础上尾随换行符的存在
在其中,log_output您可以看到实际的代码,该代码负责刷新或缓冲消息
显而易见,您的消息不包含尾随换行符。如果删除了尾随空格,则在printk调用中将消息刷新后,您将在内核日志中看到这些消息。