内核打印信息——printk()

在Linux中,内核打印语句printk()会将内核信息输出到内核信息缓冲区中,内核缓冲区是在
kernel/printk.c中通过如下语句静态定义的:

static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);

修改dmesg缓冲区的容量CONFIG_LOG_BUF_SHIFT=17,由于这个会占用内存,也不可设置太大。

init/Kconfig

    config LOG_BUF_SHIFT
    	int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
    	range 12 25
    	default 17
    	depends on PRINTK
    	help
    	  Select the minimal kernel log buffer size as a power of 2.
    	  The final size is affected by LOG_CPU_MAX_BUF_SHIFT config
    	  parameter, see below. Any higher size also might be forced
    	  by "log_buf_len" boot parameter.
     
    	  Examples:
            25 => 32768 KB
    		24 => 16384 KB
    		23 => 8192 KB
    		22 => 4096 KB 
    		21 => 2048 KB 
    		20 => 1024 KB 
    		19 => 512 KB 
    		18 => 256 KB 
    		17 => 128 KB
    		16 => 64 KB
    		15 => 32 KB
    		14 => 16 KB
    		13 =>  8 KB
    		12 =>  4 KB

————————————————
内核信息缓冲区是一个环形缓冲区(Ring Buffer),因此,如果塞入的消息过多,则就会将之前的消
息冲刷掉。
printk()定义了8个消息级别,分为级别0~7,级别越低(数值越大),消息越不重要,第0级是紧急
事件级,第7级是调试级,如下为printk()的级别定义。

#define KERN_EMERG "<0>"     /* 紧急事件,一般是系统崩溃之前提示的消息 */
#define KERN_ALERT "<1>"     /*必须立即采取行动 */
#define KERN_CRIT "<2>"      /*临界状态,通常涉及严重的硬件或软件操作失败*/
#define KERN_ERR "<3>"       /*用于报告错误状态,设备驱动程序会 经常使用 KERN_ERR 来报告来自硬件的问题 */
#define KERN_WARNING "<4>"   /*对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重的问题*/
#define KERN_NOTICE "<5>"    /*有必要进行提示的正常情形,许多与安全相关的状况用这个级别进行汇报*/
#define KERN_INFO "<6>"      /*内核提示性信息,很多驱动程序,在启动的时候,用这个级别打印出它们找到的硬件信息*/
#define KERN_DEBUG "<7>"     /*用于调试信息*/
/

通过/proc/sys/kernel/printk文件可以调节printk()的输出等级,该文件有4个数字值,如下所示。

  • 控制台(一般是串口)日志级别:当前的打印级别,优先级高于该值的消息将被打印至控制台。
  • 默认的消息日志级别:将用该优先级来打印没有优先级前缀的消息,也就是在直接写printk(“xxx”)
    而不带打印级别的情况下,会使用该打印级别。
  • 最低的控制台日志级别:控制台日志级别可被设置的最小值(一般都是1)。
  • 默认的控制台日志级别:控制台日志级别的默认值。

如在Ubuntu PC上,/proc/sys/kernel/printk的值一般如下:

$ cat /proc/sys/kernel/printk

     4   4   1   7

而我们通过如下命令可以使得Linux内核的任何printk()都从控制台输出:

# echo 8 > /proc/sys/kernel/printk

在默认情况下,DEBUG级别的消息不会从控制台输出,我们可以通过在bootargs中设置ignore_loglevel
来忽略打印级别,以保证所有消息都被打印到控制台。在系统启动后,用户还可以通过写/sys/module/printk/parameters/ignore_loglevel文件动态来设置是否忽略打印级别。
要注意的是,/proc/sys/kernel/printk并不控制内核消息进入__log_buf的门槛,因此无论消息级别是多
少,都会进入__log_buf中,但是最终只有高于当前打印级别的内核消息才会从控制台打印。
用户可以通过dmesg命令查看内核打印缓冲区,而如果使用dmesg-c命令,则不仅会显示__log_buf,还
会清除该缓冲区的内容。也可以使用cat/proc/kmsg命令来显示内核信息。/proc/kmsg是一个“永无休止的文件”,因此,cat/proc/kmsg的进程只能通过“Ctrl+C”或kill终止。

Linux驱动开发调试 – 打开dev_dbg()

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值