内核模块。如何根据传递的参数修改printk严重性?

时间:2016-09-22 19:16:33

标签: linux

我有一个内核模块可以正常工作。我能够在insmod阶段传递参数,但我想创建一个参数" verbose"。设置为true时,我的printks从KERN_INFO移动到KERN_ERR严重性。

我宁愿不用" if(verbose)"每个人之上。还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

如您所知,通常的方法是将优先级保持在格式字符串前面,让预处理器连接字符串

printk(KERN_INFO "blah\n");  // turns into 
printk("\001" "6" "blah\n"); // turns into
printk("\0016blah\n");

但这不是强制性的,有一些驱动程序从%s格式说明符输出优先级,所以你可以这样做:

printk("%smessage\n", (serious ? KERN_ERR : KERN_INFO)); 

(阅读代码,似乎是explicitly supported。)

虽然,详细程度通常是指打印出更多信息,这些信息也可能有用。要做到这一点,您需要为printk创建一个首先检查详细级别的包装器。 (或者实际上,您需要vprintk传递va_list):

__printf(2, 3) int myprintk(int onlywhenverbose, const char *fmt, ...) 
{
    if (onlywhenverbose && !verbose) 
        return 0;

    va_list args;
    int r;

    va_start(args, fmt);
    r = vprintk(fmt, args);
    va_end(args);

    return r;
}

然后使用myprintk(1, KERN_INFO "message only shown when verbose\n")__printf(a, b)include/linux/compiler-gcc.h中定义,并展开为__attribute__((format(printf, a, b))),告知gcc check the function argumentsprintf一样。

答案 1 :(得分:0)

为什么不包含没有任何#ifdefs的printk()语句。如果您需要它们,您只需更改记录仪的设置即可收集此信息。这基本上是由许多程序完成的...... I.E。合并调试信息,但使用日志记录参数来获取信息。