linux内核printk使用方法

// home/XXXX/kernel/uClinux/linux-4.4.x/include/linux/printk.h
// home/XXXX/kernel/uClinux/linux-4.4.x/include/linux/kern_levels.h
// home/XXXX/kernel/uClinux/linux-4.4.x/kernel/printk/printk.c

/* printk's without a loglevel use this.. */
#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT

/* We show everything that is MORE important than this.. */
#define CONSOLE_LOGLEVEL_DEFAULT 7 
#define CONSOLE_LOGLEVEL_MIN     1 
#define CONSOLE_LOGLEVEL_DEFAULT 7 

-------------------------------------------------------------------------
// /home/XXXX/kernel/uClinux/linux-4.4.x/include/linux/printk.h
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 */
};
-------------------------------------------------------------------------
// /home/XXXXX/kernel/uClinux/linux-4.4.x/include/linux/printk.h
extern int console_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])

root@ubuntu:/home/XXXX/kernel/uClinux/linux-4.4.x# find ./ -name '*.c' 
-or -name '*.h' | xargs grep "console_loglevel" -n --color=always

static void call_console_drivers(int level,
								 const char *ext_text, size_t ext_len,
								 const char *text, size_t len)
{
	struct console *con;

	trace_console_rcuidle(text, len);

	if (level >= console_loglevel && !ignore_loglevel)
		return;
	if (!console_drivers)
		return;

	for_each_console(con)
	{
		if (exclusive_console && con != exclusive_console)
			continue;
		if (!(con->flags & CON_ENABLED))
			continue;
		if (!con->write)
			continue;
		if (!cpu_online(smp_processor_id()) &&
			!(con->flags & CON_ANYTIME))
			continue;
		if (con->flags & CON_EXTENDED)
			con->write(con, ext_text, ext_len);
		else
			con->write(con, text, len);
	}
}

#数字越小,优先级越高。
# cat /proc/sys/kernel/printk
7       4       1       7
#
1> 控制台日志级别(一般是串口):高于该优先级的会输出到控制台
2> 默认日志优先级级别:将用该优先级打印没有制定优先级的打印信息,例如printk没有加入优先级信息
3> 最低的控制台日志级别:控制台日志级别可以被设置的最小值
4> 默认的控制台日志级别:控制台默认的日志优先级级别
可以通过写该文件改变打印级别,也可以通过修改内核改变,在kernel/printk.c中
# 
“7 4 1 7” 分别对应console_loglevel、default_message_loglevel、minimum_c onsole_loglevel、
default_console_loglevel,意味着只有优先级高于KERN_DEBUG(7)的打印消息才能输出到终端
 如果使用时没有指定日志等级,内核会选用default_message_loglevel,这个定义位于kernel/printk.c:

第一个参数表示console的loglevel,第二个参数表示prink的loglevel(只是表示不加参数,printk的默认loglevel)

改变console_loglevel值,使得所有的打印消息都能输出到终端;
# echo 1    4    1   7 > /proc/sys/kernel/printk
输入“8 4 1 7”改变console_loglevel值,使得所有的打印消息都能输出到终端;
如果想屏蔽掉所有的内核printk打印,那么只需要把第一个数值调到最小值1或者0# echo 1    4    1   7 > /proc/sys/kernel/printk
或者
# echo 0    4    0   7 > /proc/sys/kernel/printk1)日志等级
内核根据日志级别来判断是否在终端(console)上打印消息:内核把级别比某个特定值低的所有消息显示在终端
(console)上

例子:printk打印内核版本信息了: printk(KERN_NOTICE "%s", linux_banner);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

the future c

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值