17

我正在尝试创建一个 proc 条目。我的 init_module 函数如下

int init_module()
{
printk(KERN_INFO "proc2:Module Loaded\n");
proc_entry=proc_create_data(proc_name,0644,NULL,&fops,NULL);
if(proc_entry==NULL)
{
    printk(KERN_INFO "proc2:Error registering proc entry");
}
else
{
    printk(KERN_INFO "proc2:Proc Entry Created");
}
return 0;
}

以下是清理方法

void cleanup_module()
{
printk(KERN_INFO "proc2:module unloaded");
remove_proc_entry(proc_name,proc_entry);
}

程序的其余部分包括变量定义和回调函数。

当我编译这个程序时,它编译得很好。当我使用insmod它时,它不会回复我提示。 lsmod列出我的模块和一个人使用的节目(不知道是什么)。 dmesg不显示上述任何 printk 消息。

你能告诉我这里有什么问题吗?

4

3 回答 3

25

尝试echo "7" > /proc/sys/kernel/printk启用所有控制台日志级别。

数字对应如下:

#define KERN_EMERG "<0>" /* system is unusable*/
#define KERN_ALERT "<1>" /* action must be taken immediately*/
#define KERN_CRIT "<2>" /* critical conditions*/
#define KERN_ERR "<3>" /* error conditions*/
#define KERN_WARNING "<4>" /* warning conditions*/
#define KERN_NOTICE "<5>" /* normal but significant condition*/
#define KERN_INFO "<6>" /* informational*/
#define KERN_DEBUG "<7>" /* debug-level messages*/

默认数字是 4,这允许控制台至少在KERN_WARNING. 这就是为什么您看不到登录KERN_INFO级别的原因。

于 2013-09-04T07:10:31.343 回答
1

即使使用后echo "7" > /proc/sys/kernel/printkprintk对我也没有用。

https://lwn.net/Articles/487437/说的是printk被称为pr_**api ( pr_info, pr_emerg) 的修改或增强版本。

我使用pr_info而不是printk它解决了我的问题。

于 2017-05-02T14:08:19.907 回答
0

除了Wayne's Answer之外,内核源还说

如果设置了 CONFIG_DYNAMIC_DEBUG,则此宏扩展为 dynamic_pr_debug()。否则,如果定义了 DEBUG,则它等效于具有 KERN_DEBUG 日志级别的 printk。如果没有定义 DEBUG,它什么也不做。

这意味着您需要定义DEBUG或使用动态调试。我能够通过调试 printk 成功加载模块

$ sudo insmod module-name.ko dyndbg
于 2021-05-11T19:52:55.953 回答