实战-Android系统默认关闭内核打印

需求
出于性能考虑,系统默认关闭kernel 打印,需要查看是通过 dmesg 命令查看。

实现

diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index aedc7f4..503837b 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -61,10 +61,10 @@
 #endif

 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 */
+       CONSOLE_LOGLEVEL_SILENT,        /* console_loglevel */
+       CONSOLE_LOGLEVEL_SILENT,        /* default_message_loglevel */
+       CONSOLE_LOGLEVEL_SILENT,                /* minimum_console_loglevel */
+       CONSOLE_LOGLEVEL_SILENT,        /* default_console_loglevel */
 };

原理
内核log等级定义:

common/include/linux/kern_levels.h
#define KERN_SOH	"\001"		/* ASCII Start Of Header */
#define KERN_SOH_ASCII	'\001'

#define KERN_EMERG	KERN_SOH "0"	/* system is unusable */
#define KERN_ALERT	KERN_SOH "1"	/* action must be taken immediately */
#define KERN_CRIT	KERN_SOH "2"	/* critical conditions */
#define KERN_ERR	KERN_SOH "3"	/* error conditions */
#define KERN_WARNING	KERN_SOH "4"	/* warning conditions */
#define KERN_NOTICE	KERN_SOH "5"	/* normal but significant condition */
#define KERN_INFO	KERN_SOH "6"	/* informational */
#define KERN_DEBUG	KERN_SOH "7"	/* debug-level messages */

#define KERN_DEFAULT	KERN_SOH "d"	/* the default kernel loglevel */

/*
 * Annotation for a "continued" line of log printout (only done after a
 * line that had no enclosing \n). Only to be used by core/arch code
 * during early bootup (a continued line is not SMP-safe otherwise).
 */
#define KERN_CONT	KERN_SOH "c"

/* integer equivalents of KERN_<LEVEL> */
#define LOGLEVEL_SCHED		-2	/* Deferred messages from sched code
					 * are set to this special level */
#define LOGLEVEL_DEFAULT	-1	/* default (or last) loglevel */
#define LOGLEVEL_EMERG		0	/* system is unusable */
#define LOGLEVEL_ALERT		1	/* action must be taken immediately */
#define LOGLEVEL_CRIT		2	/* critical conditions */
#define LOGLEVEL_ERR		3	/* error conditions */
#define LOGLEVEL_WARNING	4	/* warning conditions */
#define LOGLEVEL_NOTICE		5	/* normal but significant condition */
#define LOGLEVEL_INFO		6	/* informational */
#define LOGLEVEL_DEBUG		7	/* debug-level messages */

printk使用示例:

printk(KERN_ALERT "hello world");
printk(LOGLEVEL_ERR "hello world");
printk("hello world");//LOGLEVEL_DEBUG

printk打印消息控制

---
#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
--
//console_loglevel只有当printk打印消息的log优先级高于
//default_message_loglevel printk打印消息时默认的log等级
//minimum_console_loglevel  console_loglevel可以被设置的最小值
//default_console_loglevel console_loglevel的缺省值

查看当前printk打印消息的log等级

cat /proc/sys/kernel/printk
4       4       1       7

4 4 1 7分别对用上面的console_loglevel、default_message_loglevel 、minimum_console_loglevel 、default_console_loglevel
显然,我们通过控制console_loglevel,即可控制打印的级别,
比如我们设置console_loglevel 为 0 (minimum_console_loglevel也必须为0),那么所有的console打印将都不会输出
我们设置console_loglevel 为7,那么所有的打印都可以输出打console控制台

实时控制内核打印级别

echo  0 > /proc/sys/kernel/printk
echo  0 0 0 0 > /proc/sys/kernel/printk
echo 7 4 1 7 > /proc/sys/kernel/printk

修改/proc/sys/kernel/printk的值实际上修改的是console_loglevel、default_message_loglevel 、minimum_console_loglevel 、default_console_loglevel 这四个对应的值

修改默认打印级别

common/include/linux/printk.h
#define CONSOLE_LOGLEVEL_SILENT  0 /* Mum's the word */
#define CONSOLE_LOGLEVEL_MIN	 1 /* Minimum loglevel we let people use */
#define CONSOLE_LOGLEVEL_QUIET	 4 /* Shhh ..., when booted with "quiet" */
#define CONSOLE_LOGLEVEL_DEFAULT 7 /* anything MORE serious than KERN_DEBUG */
#define CONSOLE_LOGLEVEL_DEBUG	10 /* issue debug messages */

#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])

common/kernel/printk/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 */
};
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值