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
之外,后者指定将消息追加到上一条消息中)。请参阅