我写了如下所述的小内核模块代码,
我正在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");
现在,当我使用insmod
编译并插入上面的模块时,我在dmesg中看不到printk消息。但是在使用rmmod
删除模块后,我会看到两个printk消息。
通过关闭外观,我发现由于printk中space
之后的\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]
答案 0 :(得分:4)
内核日志环缓冲区的行为就像是行缓冲一样,因为它可以在实现中看到:
in vprintk_emit
你可以看到它如何根据尾随换行符的存在来标记要刷新/缓冲的缓冲区
in log_output
您可以看到负责刷新或缓冲消息的实际代码
很明显,您的邮件不包含尾随换行符。如果删除了尾随空格,您将在printk
调用中刷新后在内核日志中看到这些消息。