参考 以下内容:
Linux 笔记:
https://xuesong.blog.csdn.net/article/details/109522945?spm=1001.2014.3001.5502
printk:
printk在内核源码中用来记录日志信息的函数,只能在内核源码范围内使用。用法和printf非常相似;
printk函数主要做两件事情:第一件就是将信息记录到log中,而第二件事就是调用控制台驱动来将信息输出。
1.日志级别
printk相比printf来说还多了个:日志级别的设置,用来控制printk打印的这条信息是否在终端上显示的,当日志级别的数值小于控制台级别时,printk要打印的信息才会在控制台打印出来,否则不会显示在控制台!
在我们内核中一共有8种级别,他们分别为
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */
2.控制台级别
#define MINIMUM_CONSOLE_LOGLEVEL 1 /*可以使用的最小日志级别*/
#define DEFAULT_CONSOLE_LOGLEVEL 7 /*比KERN_DEBUG 更重要的消息都被打印*/
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
int console_printk[4] = {
DEFAULT_CONSOLE_LOGLEVEL,/*控制台日志级别,优先级高于该值的消息将在控制台显示*/
/*默认消息日志级别,printk没定义优先级时,打印这个优先级以上的消息*/
DEFAULT_MESSAGE_LOGLEVEL,
/*最小控制台日志级别,控制台日志级别可被设置的最小值(最高优先级)*/
MINIMUM_CONSOLE_LOGLEVEL,
DEFAULT_CONSOLE_LOGLEVEL,/* 默认的控制台日志级别*/
};
在进行查看的时候,可以使用命令 cat /proc/sys/kernel/printk来查看这四个值
可以看出7 4 1 7 的来源在console_printk 这;
3.printk函数使用
在使用printk时我们会将日志级别放到最开始的位置,如
printk(KERN_EMERG "EMERG\n");
但无论当前控制台日志级别是何值,即使没有在控制台打印出来,可以通过两种方法查看日志:
第一种是使用dmesg命令打印。第二种是通过cat /proc/kmsg来打印。
另外如果配置好并运行了 syslogd 或 klogd,没有在控制台上显示的 printk 的信息也会追加到 /var/log/messages.log 中。
休眠唤醒
Oops
用户侧
ioremap
devmem
dump_stack
内核调用的打印
动态打印
修改宏,重定义
debugfs
linux kernel中计算代码运行时间
linux错误码
…