背景
产品开发阶段需要打印来查看设备运行状态,设备发布后需要关闭各种调试接口,接口包括了串口的内核打印。
实操
关闭命令行
//xxx.dts
bootargs = "console=null";
在设备的dts文件中console=null
即可,因为之前是真是串口,设置为null
后,就不会指定串口用作命令行
关闭内核打印printk
//defconfig
CONFIG_CONSOLE_LOGLEVEL_DEFAULT=3
//printk.h
#define CONSOLE_LOGLEVEL_DEFAULT CONFIG_CONSOLE_LOGLEVEL_DEFAULT
//printk.c
int console_printk[4] = {
CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */
MESSAGE_LOGLEVEL_DEFAULT, /* default_message_loglevel */
CONSOLE_LOGLEVEL_MIN, /* minimum_console_loglevel */
CONSOLE_LOGLEVEL_DEFAULT, /* default_console_loglevel */
};
printk
是有打印等级设置,只有当打印等级高于命令行设置才可以打印出信息,想要查看全部信息是需要使用dmesg
关闭驱动方式
#make menuconfig
Devices drivers -> character drivers->serial drivers->
[]support for console serial port
我觉得不好,有的是把驱动去除了,串口一般是通用驱动8250/16550。
原理
系统启动是uboot
启动将启动参数传给Linux内核,在setup
中处理,这里传递的启动参数就是dts中设置的bootargs
,这里虽然关闭了,其实你看到还是有信息打印的,这里打印出来的信息是uboot
打印的,这里的方式其实可以直接在c/h
文件中定义,不一定在defconfig
中。
但是,printk
打印不受任何限制,只受打印等级限制。因为关闭的是命令行,和printk
没任何关系,只需要调整打印等级直到,printk
不打印即可。
遗留问题
版本不同,是怎么区分的呢?比如一个是打开的版本,一个是发行的关闭调试的版本,肯定需要双方配置都是一致的,这里是用不同的dts
吗?如果有人知道可以告诉我一下。
参考文章
实战-Android系统默认关闭内核打印
Linux 日志级别(loglevel)详解
Linux内核强制使用自配置的cmdline