// 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/printk
(1)日志等级
内核根据日志级别来判断是否在终端(console)上打印消息:内核把级别比某个特定值低的所有消息显示在终端
(console)上
例子:printk打印内核版本信息了: printk(KERN_NOTICE "%s", linux_banner);。
linux内核printk使用方法
于 2022-01-24 11:29:04 首次发布