内核模式下系统信息输出函数printk() 与用户模式下printf()函数在输出内容上是有区别的,第一:内核在切换模式时不保存处理器的浮点状态,因此printk()并不支持浮点数运算;第二:printk()可以指定一个记录级别,内核根据这个级别来判断是否在终端上打印消息,而printf()则不要。
内核通过 printk() 输出的信息具有日志级别,日志级别是通过在 printk() 输出的字符串前加一个带尖括号的整数来控制的,如 printk("<6>Hello, world!\n");。内核中共提供了八种不同的日志级别,在 include/linux/kernel.h 中有相应的宏对应。
#define KERN_EMERG "<0>" /* system is unusable */ //是最高优先输出的紧急事件消息,OS崩溃前输出提示消息
#define KERN_ALERT "<1>" /* action must be taken immediately */ //输出警告消息,通知需要采取措施
#define KERN_CRIT "<2>" /* critical conditions */ //发生严重的软件或者硬件操作失败时,进行输出提示
#define KERN_ERR "<3>" /* error conditions */ //设备驱动程序常常用KERN_ERR来报告硬件错误信息
#define KERN_WARNING "<4>" /* warning