VFS: Mounted root(nfs filesystem) on device 0:13.// 这一句是 kernel_init_freeable 打印出来的.
Freeing unused kernel memory:284K (80629000-80670000)//这一句是 free_initmem->free_reserved_area 打印出来的 -----------------------------------//从这一句开始就不是内核打印的了.是 init 用户进程打印出来的
welcome to A9 vexpress board
-----------------------------------
Please press Enter to activate this console.
2. dmesg没有显示内核最开始的打印信息,如何调整.
调整 CONFIG_LOG_BUF_SHIFT
可以直接修改 .config,也可以直接修改 def_config
make menuconfig 位置在
General setup --->(14) Kernel log buffer size(16=>64KB,17=>128KB)
help 信息
| CONFIG_LOG_BUF_SHIFT:|||| Select the minimal kernel log buffer size as a power of 2.|| The final size is affected by LOG_CPU_MAX_BUF_SHIFT config || parameter, see below. Any higher size also might be forced || by "log_buf_len" boot parameter.|||| Examples:||17=>128 KB ||16=>64 KB ||15=>32 KB ||14=>16 KB ||13=>8 KB ||12=>4 KB |||| Symbol: LOG_BUF_SHIFT [=14]|| Type : integer || Range :[1221]|| Prompt: Kernel log buffer size(16=>64KB,17=>128KB)|| Location:||-> General setup || Defined at init/Kconfig:820|| Depends on: PRINTK [=y]
怎么 改变打印级别
loglevel= All Kernel Messages with a loglevel smaller than the
console loglevel will be printed to the console. It can
also be changed with klogd or other programs. The
loglevels are defined as follows:0(KERN_EMERG) system is unusable
1(KERN_ALERT) action must be taken immediately
2(KERN_CRIT) critical conditions
3(KERN_ERR) error conditions
4(KERN_WARNING) warning conditions
5(KERN_NOTICE) normal but significant condition
6(KERN_INFO) informational
7(KERN_DEBUG) debug-level messages
#defineKERN_EMERG"\001""<0>"通常是系统崩溃前的信息#defineKERN_ALERT"\001""<1>"需要立即处理的消息#defineKERN_CRIT"\001""<2>"严重情况#defineKERN_ERR"\001""<3>"错误情况#defineKERN_WARNING"\001""<4>"有问题的情况#defineKERN_NOTICE"\001""<5>"正常情况,但仍然要注意#defineKERN_INFO"\001""<6>"信息型消息#defineKERN_DEBUG"\001""<7>"用作调试作用printk("\001""<0>""level 0!\n");// printk(KERN_EMERG "level 0!\n");printk("\001""<1>""level 1!\n");// printk(KERN_ALERT "level 1!\n");printk("\001""<2>""level 2!\n");printk("\001""<3>""level 3!\n");printk("\001""<4>""level 4!\n");printk("\001""<5>""level 5!\n");printk("\001""<6>""level 6!\n");printk("\001""<7>""level 7!\n");
内核提供了动态打印的系统,例如pr_debug,dev_debug这种接口。他们是对printk(log_level " ")的二次封装
include/linux/kernel.h
#definepr_emerg(fmt,...)\printk(KERN_EMERG pr_fmt(fmt),##__VA_ARGS__)#definepr_alert(fmt,...)\printk(KERN_ALERT pr_fmt(fmt),##__VA_ARGS__)#definepr_crit(fmt,...)\printk(KERN_CRIT pr_fmt(fmt),##__VA_ARGS__)#definepr_err(fmt,...)\printk(KERN_ERR pr_fmt(fmt),##__VA_ARGS__)#definepr_warning(fmt,...)\printk(KERN_WARNING pr_fmt(fmt),##__VA_ARGS__)#definepr_notice(fmt,...)\printk(KERN_NOTICE pr_fmt(fmt),##__VA_ARGS__)#definepr_info(fmt,...)\printk(KERN_INFO pr_fmt(fmt),##__VA_ARGS__)#definepr_cont(fmt,...)\printk(KERN_CONT fmt,##__VA_ARGS__)// NOT LEVEL 7 /* If you are writing a driver, please use dev_dbg instead */#ifdefined(CONFIG_DYNAMIC_DEBUG)/* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */#definepr_debug(fmt,...) \ dynamic_pr_debug(fmt, ##__VA_ARGS__)#elifdefined(DEBUG)#definepr_debug(fmt,...) \ printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)#else#definepr_debug(fmt,...) \ no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)#endif
4. dmesg 的使用
BusyBox v1.30.0.git(2019-02-1518:29:52 PST) multi-call binary.
Usage: dmesg [-c][-n LEVEL][-s SIZE]
Print or control the kernel ring buffer
-c Clear ring buffer after printing // 打印后清空buf-n LEVEL Set console logging level // 设置当前控制台优先级-s SIZE Buffer size //-r Print raw message buffer // 可看出打印优先级
ubuntu dmesg
dmesg -T // 按照标准事件显示
dmesg -d // 显示两条信息的时间间隔
dmesg -d -T
dmesg | tail // 最近一次内核输出
dmesg -l 5// 只打印level 5
include/linux/printk.h
406/* If you are writing a driver, please use dev_dbg instead */407 #ifdefined(CONFIG_DYNAMIC_DEBUG)|| \
408(defined(CONFIG_DYNAMIC_DEBUG_CORE)&&defined(DYNAMIC_DEBUG_MODULE))409 #include <linux/dynamic_debug.h>410411/**
412 * pr_debug - Print a debug-level message conditionally
413 * @fmt: format string
414 * @...: arguments for the format string
415 *
416 * This macro expands to dynamic_pr_debug() if CONFIG_DYNAMIC_DEBUG is
417 * set. Otherwise, if DEBUG is defined, it's equivalent to a printk with
418 * KERN_DEBUG loglevel. If DEBUG is not defined it does nothing.
419 *
420 * It uses pr_fmt() to generate the format string (dynamic_pr_debug() uses
421 * pr_fmt() internally).
422 */423 #define pr_debug(fmt,...) \
424dynamic_pr_debug(fmt, ##__VA_ARGS__)425 #elif defined(DEBUG)426 #define pr_debug(fmt,...) \
427printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)428 #else429 #define pr_debug(fmt,...) \
430no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)431 #endif
#cat/system/etc/init/logcatd.rc#logcatdservice
service logcatd /system/bin/logcatd -L -b ${logd.logpersistd.buffer:-all}-v threadtime -v usec -v printable -D -f /data/misc/logd/logcat -r 1024-n ${logd.logpersistd.size:-256}--id=${ro.build.id}
class late_start
disabled
#logdfor write to /data/misc/logd, log group for read from log daemon
user logd
group log
writepid /dev/cpuset/system-background/tasks
oom_score_adjust -600