打印的优先级以及动态打印

这里有两个方向的打印概念: 
1,控制台的打印级别 
2,printk的默认打印级别

1.控制台的打印级别: 
启动后使用这个命令: 
cat /proc/sys/kernel/printk, 
可以看到:8 4 1 7 //数字越小代表级别越高 
上述数字分别为: 
8 :控制台的日志打印级别,即如果使用带打印级别的printk的打印级别 > 控制台的级别,才可以输出该打印,也就是说,它控制这内核启动时候哪些级别的打印应该输出 
这个值可以在启动后通过echo "8 4 1 7" > /proc/sys/kernel/printk去修改,但是此时内核已经启动了,修该了以后,只是对于修改后的程序执行起作用,那么如果要 
修改启动时候的打印级别该怎么办? 
这个值是靠启动参数中的cmdline中的loglevel= ?来传入内核的,所以要在启动前修改控制台的打印级别就修改这个启动参数就可以 
4:这个值表示的printk的默认打印级别,即使用printk("")这种方式打印的打印级别, 
printk(log_level," ");这种方式是显示的使用printk的打印级别,用的什么级别就是什么级别,例如printk(KERN_DEBUGl," "); 
这个值可以通过echo "8 4 1 7" > /proc/sys/kernel/printk的方式去修改,也可以在内核配置项中修改它默认的配置

 
 
  1. Kernel hacking --->
  2. printk and dmesg options --->
  3. (4) Default message log level (1-7)

1:控制台可以接收的最低的打印级别 7:默认的控制台log级别 所以如果你使用了printk(“ ”)这种没有指定打印级别的方式,如果想要打印出来 要么修改控制台的打印级别小于printk的默认打印级别, 要么修改printk的默认打印级别大于控制台的打印级别

但是一般不要这么做,内核提供了动态打印的系统,例如 pr_debug,dev_debug这种接口。他们是对printk(log_level," ")的二次封装,可以动态的修改控制台的打印  去控制他们的输出。这样的话,printk的默认优先级我们就不用再去关注。只要不使用printk(“ ”)这种方式  ===========================分割线=========================  如何设置控制台的打印级别?  这个值是靠启动参数中的cmdline中的loglevel= ?来传入内核的  -------------------------分割线------------------------------  

使用老的方式的printk(“”)没有打印了? 如果还没有出来打印,可以在串口输入下面的命令就可以把缓存区里的打印打出来 dmesg 如果老的系统大量使用了printk(“”),而不是这种pr_debug或者dev_debug 在内核启动后,如果使用printk("")这种方式打印不出,可以使用 cat /proc/sys/kernel/printk 看下printk的默认打印级别是不是 大于 控制台的打印级别,使用 echo "8 4 1 7" > /proc/sys/kernel/printk修改就可以

如果发现使用了printk(""),在内核启动过程中的打印出不来,然后内核启动后查看cat /proc/sys/kernel/printk,发现printk的默认打印级别也 大于 控制台的打印级别  但是启动中的打印就是没有,此时肯定是默认的printk的默认打印级别 小于 控制台的打印级别,只是在启动后对printk的默认打印级别做了,常用的做法是在文件系统的启动脚本中做了类似:  echo "8 4 1 7" > /proc/sys/kernel/printk这样的修改,所以启动后查看cat /proc/sys/kernel/printk,printk的默认打印级别也 大于 控制台的打印级别。  这种情况,只要使用马克 menuconfig看下内核默认的printk的打印级别,是否和启动后的一致,如果不一致肯定是在启动后被改了  对于一个新系统如何使能printk?  如果使用cat /proc/sys/kernel/printk发现没有printk节点,那一定是printk没有被使能  printk的实现在/kernel/printk/print.c  其中export出来的接口printk并没有什么宏的限制,查看Makefie:
 
   
  1. obj-y = printk.o
  2. obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o

并没有什么宏限制其编译,即默认会编译 
但在printk.c中发现printk的实现被宏CONFIG_PRINTK来限定,即如果不使能CONFIG_PRINTK。则就没有printk的实现。 
所以我们找下CONFIG_PRINTK的控制,这个控制一般在某个Kconfig文件中,在Kconfig中以PRINTK的形式出现(没有CONFIG,CONFIG是脚本加上去的)搜索后发现在

 
   
  1. Symbol: PRINTK [=y]
  2. | Type : boolean
  3. | Prompt: Enable support for printk
  4. | Location:
  5. | -> General setup
  6. | (1) -> Configure standard kernel features (expert users) (EXPERT [=y])
  7. | Defined at init/Kconfig:1354
  8. | Selects: IRQ_WORK [=y]

所以我们去配置这个宏:

 General setup  --->   
        -*- Configure standard kernel features (expert users)  ---> 
                          [*]   Enable support for printk 

打开这个开关后即可找到使能printk的实现。 
如何设置printk的默认打印级别?

 Kernel hacking  ---> 
        printk and dmesg options  --->  
                (4) Default message log level (1-7) 

=============================分割线========================= 
如何开启kernel的动态打印: 
内核的动态打印,诸如pr_xx和dev_xx这些都是基于基本的printk()打印的封装,所以要开启动态打印,首先: 
1.按照上述的方式使能printk(只使能,不需要关心printk的默认打印基本,即使用不带flag的printk()这种方式) 
2.配置kernel使其支持动态打印,如下配置

 Kernel hacking  --->  
           printk and dmesg options  ---> 
                [*] Enable dynamic printk() support

配置完以后就可以开心的使用pr_xxx或者dev_xxx这样的打印了。 
如果发现pr__的打印没有出现,首先检查: 
1.控制台的打印级别是不是高于当前pr_xx的打印级别,如果是,调小控制台的打印级别 
2.看下printk的内核配置有没有使能(动态打印是基于基本的printk()打印的封装)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值