我有一个内核模块可以正常工作。我能够在insmod阶段传递参数,但我想创建一个参数" verbose"。设置为true时,我的printks从KERN_INFO移动到KERN_ERR严重性。
我宁愿不用" if(verbose)"每个人之上。还有其他方法吗?
答案 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 arguments与printf
一样。
答案 1 :(得分:0)
为什么不包含没有任何#ifdefs的printk()语句。如果您需要它们,您只需更改记录仪的设置即可收集此信息。这基本上是由许多程序完成的...... I.E。合并调试信息,但使用日志记录参数来获取信息。