使用dmesg打印所有日志( 三 )

<3>"// 报告错误#defineKERN_WARNING"<4>"//警告#defineKERN_NOTICE"<5>"//普通但还是须注意#defineKERN_INFO"<6>"// 信息#defineKERN_DEBUG"<7>"// 调试信息
使用
格式可以加上打印级别,形式如下:
printk(KERN_EMERG "abc")===printk( "<0>abc");
修改打印级别
临时修改/proc/sys//,重启后失效,下述命令关闭打印,也就是设置小于EVEL=1才打印
echo "1 4 1 7" > /proc/sys/kernel/printk
修改初始化的数组或者是那个判断的函数

使用dmesg打印所有日志

文章插图
int console_printk[4] = {1,//DEFAULT_CONSOLE_LOGLEVEL,/* console_loglevel */DEFAULT_MESSAGE_LOGLEVEL,/* default_message_loglevel */MINIMUM_CONSOLE_LOGLEVEL,/* minimum_console_loglevel */DEFAULT_CONSOLE_LOGLEVEL,/* default_console_loglevel */};
或者修改 内核源代码
static void _call_console_drivers(unsigned long start,unsigned long end, int msg_log_level){//if ((msg_log_level < console_loglevel || ignore_loglevel) &&if ((msg_log_level < 1 || ignore_loglevel) &&console_drivers && start != end) {if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {/* wrapped write */__call_console_drivers(start & LOG_BUF_MASK,log_buf_len);__call_console_drivers(0, end & LOG_BUF_MASK);} else {__call_console_drivers(start, end);}}}
设置uboot传递的参数,我们可以看到级别定义如下,搜索文本,可以找到一些函数
更多的参考文档可以查看\-.txt,搜索
#define console_loglevel (console_printk[0])
//init\main.cstatic int __init debug_kernel(char *str){if (*str)return 0;console_loglevel = 10;return 1;}static int __init quiet_kernel(char *str){if (*str)return 0;console_loglevel = 4;return 1;}__setup("debug", debug_kernel);__setup("quiet", quiet_kernel);static int __init loglevel(char *str){get_option(&str, &console_loglevel);return 1;}__setup("loglevel=", loglevel);
也就是说可以用这些参数传递打印级别
loglevel=0 console=ttySA0,115200debug # 使用级别10quiet # 使用级别4set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc loglevel=0 console=ttySAC0boot# cat /proc/sys/kernel/printk0417set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc debug console=ttySAC0boot# cat /proc/sys/kernel/printk10417set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc quiet console=ttySAC0boot# cat /proc/sys/kernel/printk4417
使用dmesg打印所有日志
使用这个命令可以打印那些被屏蔽的缓冲,可以保存到文本里面去看
# dmesg ....?...................................... done, booting the kernel.Linux version 2.6.22.6 (book@100ask) (gcc version 3.4.5) #3 Wed Jan 9 15:33:52 CST 2019CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
测试
修改级别为0,都可以实现如下效果,不打印内核启动信息
Starting kernel ...Uncompressing Linux...................................................................................................................... done, booting the kernel.init started: BusyBox v1.7.0 (2018-11-13 23:35:45 CST)starting pid 766, tty '': '/etc/init.d/rcS'Please press Enter to activate this console.starting pid 771, tty '/dev/console': 'bin/sh'
也可以# cat /proc/sys// 来查看,除了那个修改函数中的if判断的,都可以打印出来如下效果
# cat /proc/sys/kernel/printk1417
修改if判断的依然是7 4 1 7,因为这个文件本质上就是这个数组显示 哈哈
小结
内核解析uboot传递的命令行参数,来寻找实际的硬件来输出信息
console_setup>add_preferred_console
注册实际的硬件驱动,加入到链表
s3c24xx_serial_initconsole>register_console>比较命令行的name 与 硬件驱动的name ,如果匹配,加入到 console_drivers链表中