我是编程初学者LKM
。
我正在编写一个简单的参数可传递模块,它获取命令行参数,然后将它们记录在警报级别。
问题是我不知道为什么它不调用函数printk
中的第二个hello_start
,也许那里发生了错误,但令人惊奇的是它在 unloading( rmmod
) 过程中工作。这是日志和代码:
// insmod thetestmodule.ko yes_no=1
Dec 26 20:25:31 duckduck kernel: [ 995.877225] Hi darcy. I'm now alive!
// Expect the argument here.
// rmmod thetestmodule
Dec 26 20:26:11 duckduck kernel: [ 995.877230] This is the passed argument: 1
Dec 26 20:26:11 duckduck kernel: [ 1035.956640] Understood. Bye.
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#define AUTHOR "Darcy"
MODULE_LICENSE("GPL");
MODULE_AUTHOR(AUTHOR);
MODULE_DESCRIPTION("OH. Kernel log, ALERT LEVEL O_o");
MODULE_VERSION("0.1");
static int short yes_no;
module_param(yes_no , short ,0);
MODULE_PARM_DESC(yes_no, "Enter 0 or 1 to say if you want the module be loaded in rescue mode.");
static int __init hello_start(void)
{
printk(KERN_ALERT "Hi darcy. I\'m now alive!\n");
printk(KERN_ALERT "This is the passed argument: %d" , yes_no);
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Understood. Bye.\n");
return NULL;
}
module_init(hello_start);
module_exit(hello_end);
谢谢你的合作!
答案1
你的第二个末尾printk()
没有 a ,而第一个末尾有。\n
此外,单词后面括号中的数字kernel:
是以秒为单位的系统正常运行时间,因此看起来第二条消息实际上是在与第一条消息相同的时间内生成的。
我的第一个假设是,缺少\n
行终止符导致正在读取内核消息缓冲区的进程等待,以防更多文本即将到达,并且消息的其余部分仅在第三个之后由用户空间日志守护进程\n
处理消息表明已收到完整的行。
在内核消息缓冲区(请参阅命令dmesg
)中,括号内的正常运行时间通常是消息的第一个元素:人类可读的时间戳、主机名和单词kernel:
由用于读取内核消息缓冲区和注入内核的任何日志记录系统添加消息进入用户空间日志流。
因此,尝试添加\n
到第二条消息的末尾,如下所示:
printk(KERN_ALERT "This is the passed argument: %d\n" , yes_no);