0

我正在尝试让我的模块显示一个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但我无法向它添加任何参数并且它显示消息但它不显示任何内容 forfirstname或 for myid

4

2 回答 2

1

我认为模块 init 期望函数中没有参数的问题,它必须是 void (你可以以不同的方式添加它们),所以基本上你的函数是用当前在堆栈中的垃圾调用的,这可能不是它可能为零,否则您的内核将崩溃。

你想打印什么?我了解 current->id,但不了解其他人。

于 2012-05-31T16:47:17.613 回答
0

您没有指定日志级别,所以我怀疑它被过滤掉了,低于阈值。在您的格式字符串前面粘贴一个 KERN_WARNING 并验证它是否打印。没有日志级别的消息在 .config 文件中的 CONFIG_DEFAULT_MESSAGE_LOGLEVEL 处解释。

于 2012-05-31T16:34:12.933 回答