gpt4 book ai didi

c - 为什么 printk 不在内核日志中打印消息(dmesg)

转载 作者:行者123 更新时间:2023-12-04 12:00:09 31 4
gpt4 key购买 nike

我编写了如下所述的小内核模块代码,
我正在 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 消息。

通过闭包看,我发现它正在发生是因为 space\n 之后在 printk 中。
但是我不明白为什么会这样。
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]

最佳答案

内核日志环形缓冲区的行为就好像它是行缓冲的,从实现中可以看出:

  • in vprintk_emit 您可以看到它如何根据尾随换行符的存在来标记要刷新/缓冲的缓冲区
  • in log_output 您可以看到负责刷新或缓冲消息的实际代码

  • 很明显,您的消息不包含尾随换行符。如果您删除了尾随空格,您将在内核日志中看到这些消息在它们被刷新到 printk 中之后。通话。

    关于c - 为什么 printk 不在内核日志中打印消息(dmesg),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38822599/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com