这里有两个方向的打印概念:
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
的方式去修改,也可以在内核配置项中修改它默认的配置
Kernel hacking --->
printk and dmesg options --->
(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
修改就可以
obj-y = printk.o
obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o
并没有什么宏限制其编译,即默认会编译
但在printk.c中发现printk的实现被宏CONFIG_PRINTK来限定,即如果不使能CONFIG_PRINTK。则就没有printk的实现。
所以我们找下CONFIG_PRINTK的控制,这个控制一般在某个Kconfig文件中,在Kconfig中以PRINTK的形式出现(没有CONFIG,CONFIG是脚本加上去的)搜索后发现在
Symbol: PRINTK [=y]
| Type : boolean
| Prompt: Enable support for printk
| Location:
| -> General setup
| (1) -> Configure standard kernel features (expert users) (EXPERT [=y])
| Defined at init/Kconfig:1354
| 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()打印的封装)