gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:12:07 26 4
gpt4 key购买 nike

我有一个运行良好的内核模块。我可以在 insmod 阶段传递参数,但我想创建一个“详细”参数。当设置为 true 时,我的 printks 从 KERN_INFO 移动到 KERN_ERR 严重性。

我不想将 printk 行数加倍,每行上面都有一个“if(verbose)”。还有别的办法吗?

最佳答案

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

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 一样。

关于linux - 内核模块。如何根据传递的参数修改 printk 严重性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39652385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com