我正在尝试让我的模块显示为printk
。我是新手,所以我可能会遇到一些编程错误。这是我的模块C文件:
#include <linux/linkage.h>
#include <linux/time.h>
#include <linux/module.h>
asmlinkage long sys_mycall(int myid, char* firstname)
{
printk ("Hello, %s! \n sys_mycall called from process %d with ID %d. \n",
firstname, current->id, myid);
return 0;
}
static int my_init(void)
{
return 0;
}
static int my_exit(void)
{
printk("Goodbye!");
return 0;
}
module_init(sys_mycall);
module_exit(my_exit);
首先,我不知道箭头指针是如何工作的所以我通常会从printk
中省略它,所以它完美地编译。如果有人可以给我一个关于如何理解它的链接,我会非常感激。
当我在终端中使用insmod
插入广告然后使用dmesg
显示消息时,module_init
拨打sys_mycall
我会收到消息,但我无法添加任何消息它的参数,它会显示消息,但不显示firstname
或myid
的任何内容。
答案 0 :(得分:1)
我认为模块init期望函数中没有参数的问题,它必须是void(你可以用不同的方式添加它们),所以基本上你的函数是用当前在栈中的垃圾来调用的,这可能是除了它可能为零,否则你的内核会崩溃。
你想要什么打印?我理解current-&gt; id,但没有其他的。
答案 1 :(得分:0)
您没有指定日志级别,因此我怀疑它被过滤掉低于阈值。将KERN_WARNING粘贴在格式字符串前面并验证它是否打印。没有日志级别的消息在.config文件的CONFIG_DEFAULT_MESSAGE_LOGLEVEL中解释。