什么扩展了 KERN_INFO,它在哪里实现?

What exactly expands the KERN_INFO, and where it is implemented?

在这个问题中:,有人说KERN_INFO扩展为""[=12=]1" "6"。我知道第一个 [=13=] 是空字符,但是 01 是什么?因为我想是八进制的。当预处理器将它连接在一起成为 "[=15=]16" 时,null 之后的其余部分是 016,即十进制的 14。所以我在 ascii 中查找并发现它是 0E SO (shift out)?这对我来说没有意义,它应该与日志记录有关(因为它是 printk 的目的)。那么扩展后的KERN_INFO宏序列是什么意思呢?

此外,我试图在 /usr/include/linux/kernel.h 中查看源代码,但没有找到宏。那么它是在 kernel.h 还是其他地方?

"[=10=]1" "6" 是两个字符串文字,它们将(与任何其他相邻的字符串文字)连接成一个字符串文字。 (连接在 C 标准中定义的 翻译阶段 6 完成。)

这些字符串文字中的第一个 "[=11=]1" 包含单个 八进制转义序列 ,定义单个字符。字符串文字或字符常量中的八进制转义序列由反斜杠 (\) 后跟 1 到 3 个八进制数字(在本例中为 001)组成。在这种情况下,单个字符的数字代码为 1,对应于 ASCII SOH(标题开始)字符。

字符串文字 "[=14=]16" 包含两个字符 '[=15=]1''6' 的序列,因为八进制转义序列总是在最多 3 个八进制数字后终止。

转义序列不跨越相邻字符串文字之间的边界。 (转义序列在翻译阶段 3 扩展,因此在相邻字符串文字在翻译阶段 6 连接之前已经扩展)。因此,字符串文字对 "" "6" 等价于(连接后)单个字符串文字 "[=14=]16",而不是 "".

@Peter L.所述,KERN_INFO宏和其他"kernel level"宏定义在Linux内核源代码的"include/linux/kern_levels.h"中。实际上,从内核版本 3.6 开始就是如此。在内核版本 3.6 之前,它们在 "include/linux/printk.h" 中定义,并使用不同的字符串格式,在尖括号之间指定内核级别编号(例如 KERN_INFO 曾经被定义为 "<6>")。

这些内核级宏的目的是在 printk 函数的格式字符串参数前加上特殊代码,以指定 log-level 用于写入内核日志的消息(除了来自 KERN_CONT,指定该消息将附加到上一条消息)。