内核开发中,使用printk十分常见,但是也要注意,一次队友在开发中,想要打印一个大缓冲区的数据,就用printk打印,但是只能打印前约1K的数据,后来发现printk的实现中,临时缓冲区确实有LOG_LINE_MAX限制,现在简单总结下注意点:
1.printk的实现很低效,不要在内核大量打印,尤其是在某些性能测试中,中断上下文尽量少用,有可能大量的printk导致系统crash,亲身经历过。
2.内核在切换模式时不保存处理器的浮点状态,因此printk并不支持浮点数运算。
3.printk使用的“ring buffer”,如果来不及刷新到syslog中,日志有可能被覆盖,即数据丢失。printk函数执行时首先设法获取控制台信号量,然后将要输出的字符存储到控制台的日志缓冲区,再调用控制台驱动程序来刷新缓冲区。若printk无法获得控制台信号量,则只能把要输出的字符存储到日志缓冲区,并依赖拥有控制台信号量的进程来刷新这个缓冲区。printk函数会将数据存储到日志缓冲区,但是为了安全考虑,在这之前需要使用日志缓冲区锁,保证并发调用printk的安全性。
4.内核启动初期,是无法使用printk输出在终端上的,只有在终端和控制台被初始化后,才能输出到终端。
简单提及下用户态的printf,可利用fprintf(log->file, "%s", info);//设置log->file可以将日志记录到指定位置,stderr,syslog或者指定文件中等。