Linux kernel 到底是什么扩展了KERN_信息,它在哪里实现?

Linux kernel 到底是什么扩展了KERN_信息,它在哪里实现?,linux-kernel,kernel,Linux Kernel,Kernel,在这个问题上:,有人说,KERN\u INFO扩展到“\001”“6”。我知道第一个\0是空字符,但是什么是01?我假设是八进制的。当预处理器将它连接到“\0016时“,null后面的剩余部分是016,十进制为14。所以我在ascii中查找,发现它是0E So(shift out)?这对我来说毫无意义,它应该与日志记录有关(因为它是printk的目的)。那么扩展后的KERN_INFO宏序列的含义是什么 此外,我还尝试在源代码中查找/usr/include/linux/kernel.h,但没有找到

在这个问题上:,有人说,
KERN\u INFO
扩展到
“\001”“6”
。我知道第一个
\0
是空字符,但是什么是
01
?我假设是八进制的。当预处理器将它连接到
“\0016时“
,null后面的剩余部分是
016
,十进制为
14
。所以我在
ascii
中查找,发现它是
0E So(shift out)
?这对我来说毫无意义,它应该与日志记录有关(因为它是
printk
的目的)。那么扩展后的
KERN_INFO
宏序列的含义是什么

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

“\001”“6”
是两个字符串文字,将它们(与任何其他相邻字符串文字)连接成一个字符串文字。(按照C标准中的定义,连接在转换阶段6完成。)

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

字符串文本
“\0016”
包含两个字符的序列
'\001'
'6'
,因为八进制转义序列总是在最多3个八进制数字之后终止

转义序列不会跨越相邻字符串文字之间的边界。(转义序列在转换阶段3扩展,因此在转换阶段6连接相邻字符串文字之前已经扩展)。因此,一对字符串文字
“\1”“6”
与单个字符串文字
“\0016”
,而不是
“\16”
,是等价的(在串联之后)

如所述,
KERN_INFO
宏和其他“内核级”宏在linux内核源代码的“include/linux/KERN_levels.h”中定义。事实上,这是真实的,因为内核版本3.6。在内核版本3.6之前,它们是在“include/linux/printk.h”中定义的,并使用不同的字符串格式,在尖括号之间指定内核级别编号(例如
KERN_INFO
过去被定义为

这些内核级宏的目的是在
printk
函数的format string参数前面加上特殊代码,以指定写入内核日志的消息所使用的日志级别(除了
KERN_CONT
之外,后者指定将消息追加到上一条消息中)。

“\001”“6”
是两个字符串文字,它们将(与任何其他相邻的字符串文字)连接成一个字符串文字。(按照C标准中的定义,连接在转换阶段6完成。)

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

字符串文本
“\0016”
包含两个字符的序列
'\001'
'6'
,因为八进制转义序列总是在最多3个八进制数字之后终止

转义序列不会跨越相邻字符串文字之间的边界。(转义序列在转换阶段3扩展,因此在转换阶段6连接相邻字符串文字之前已经扩展)。因此,一对字符串文字
“\1”“6”
与单个字符串文字
“\0016”
,而不是
“\16”
,是等价的(在串联之后)

如所述,
KERN_INFO
宏和其他“内核级”宏在linux内核源代码的“include/linux/KERN_levels.h”中定义。事实上,这是真实的,因为内核版本3.6。在内核版本3.6之前,它们是在“include/linux/printk.h”中定义的,并使用不同的字符串格式,在尖括号之间指定内核级别编号(例如
KERN_INFO
过去被定义为

这些内核级宏的目的是在
printk
函数的format string参数前面加上特殊代码,以指定写入内核日志的消息所使用的日志级别(除了
KERN_CONT
之外,后者指定将消息追加到上一条消息中)。

请参阅