Linux 驱动 Printk 在终端没有输出

Posted qlexcel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 驱动 Printk 在终端没有输出相关的知识,希望对你有一定的参考价值。

驱动使用printk 来输出信息,而不是 printf!因为在 Linux 内核中没有 printf 这个函数。 printk 相当于 printf 的孪生兄妹, printf运行在用户态, printk 运行在内核态。在内核中想要向控制台输出或显示一些内容,必须使用printk 这个函数。不同之处在于, printk 可以根据日志级别对消息进行分类,一共有 8 个消息级别,这 8 个消息级别定义在文件 include/linux/kern_levels.h 里面,定义如下:

#define KERN_SOH "\\001"
#define KERN_EMERG KERN_SOH "0" /* 紧急事件,一般是内核崩溃 */
#define KERN_ALERT KERN_SOH "1" /* 必须立即采取行动 */
#define KERN_CRIT KERN_SOH "2" /* 临界条件,比如严重的软件或硬件错误*/
#define KERN_ERR KERN_SOH "3" /* 错误状态,一般设备驱动程序中使用KERN_ERR 报告硬件错误 */
#define KERN_WARNING KERN_SOH "4" /* 警告信息,不会对系统造成严重影响 */
#define KERN_NOTICE KERN_SOH "5" /* 有必要进行提示的一些信息 */
#define KERN_INFO KERN_SOH "6" /* 提示性的信息 */
#define KERN_DEBUG KERN_SOH "7" /* 调试信息 */

一共定义了 8 个级别,其中 0 的优先级最高, 7 的优先级最低。
如果要设置消息级别,参考如下示例:

printk(KERN_EMERG "gsmi: Log Shutdown Reason\\n");

上述代码就是设置“gsmi: Log Shutdown Reason\\n”这行消息的级别为KERN_EMERG。如果使用printk的时候不设置消息级别,那么printk将会采用默认级别MESSAGE_LOGLEVEL_DEFAULTMESSAGE_LOGLEVEL_DEFAULT 默认为 4。

在 include/linux/printk.h 中有个宏CONSOLE_LOGLEVEL_DEFAULT,定义如下:

#define CONSOLE_LOGLEVEL_DEFAULT 7

CONSOLE_LOGLEVEL_DEFAULT 控制着哪些级别的消息可以显示在控制台上,此宏默认为 7,意味着只有优先级高于 7 的消息才能显示在控制台上。
这个就是 printk 和 printf 的最大区别,可以通过消息级别来决定哪些消息可以显示在控制台上。默认消息级别为 4, 4 的级别比 7 高,所示直接使用 printk 输出的信息是可以显示在控制台上的。

查看日志等级信息

[root@RedHat /]# cat /proc/sys/kernel/printk
4       4       1       7

(1) 控制台日志级别:优先级高于该值的消息将被打印至控制台。
(2) 缺省的消息日志级别:将用该值来打印没有优先级的消息。
(3) 最低的控制台日志级别:控制台日志级别可能被设置的最小值。
(4) 缺省的控制台:控制台日志级别的缺省值。

设置日志等级信息
根据上面的描述,只需设置第一个值就可以,例如:

[root@RedHat /]# echo 5 >/proc/sys/kernel/printk
[root@RedHat /]# cat /proc/sys/kernel/printk
5       4       1       7

以上是关于Linux 驱动 Printk 在终端没有输出的主要内容,如果未能解决你的问题,请参考以下文章

第十章

第十章心得

第十章随笔

嵌入式Linux的调试技术

Andriod深度探索(卷1)HAL与驱动开发 第十章读书心得

第十章读后感