【发布时间】:2016-07-20 22:41:47
【问题描述】:
printk 调用示例:
printk(KERN_INFO "Log message.\n");
也许这个问题更多地是关于 C 的,因为在没有逗号分隔参数之前我从未见过 C 中的函数。
这是如何工作的?编译器如何处理这些信息?由于日志级别是整数,而消息是指向char数组的指针,所以必须分别传递。
【问题讨论】:
-
编译器支持的字符串文字连接。看
KERN_INFO的定义。我不做内核,但我敢打赌这是一个字符串文字#define -
@WhozCraig:字符串文字连接不仅仅是编译器支持的。它由语言定义,自 1989 年以来一直如此。
-
请注意,多个参数用逗号分隔:
printfk(KERN_INFO "n = %d\n", n);。格式字符串KERN_INFO "n = %d\n"是第一个参数,n是第二个参数。 -
printk类似于printf,它采用格式字符串和零个或多个以下参数。并且有可能(这纯粹是推测)Linux 的早期版本不支持不同的日志级别。通过将字符串添加到格式中来添加它们不会破坏现有代码。 -
Why not pass these as separate arguments?效率。为什么要单独给push一个额外的参数,然后让 printk 将它预先附加到字符串中?在传递寄存器中前几个参数的 ABI 中,这实际上浪费了传递参数的寄存器。还有一个代码大小的优势。推送一个立即整数的机器指令总是比将数据直接添加到字符串中要大。传递一个指针而不是实际的字节会更糟,因为这样字节需要存储在某个地方,并且代码中需要一个 32 位指针。
标签: c linux linux-kernel