一、LK层:
首先,在LK中,有一个对log打印级别的控制文档,其路径一般为:
vendor\mediatek\proprietary\bootable\bootloader\lk\include\debug.h(以mtk平台为例)
在include\debug.h重要代码为:
//下面做个判断:意思是如果makefile(相应的平台mk文件) 定义了DEBUG的值,就是用它,否则默认为2等级
//在bootloader\lk\project\rlk6737m_65_n.mk中:DEBUG := 2
#if defined(DEBUG)
#define DEBUGLEVEL DEBUG
#else
#define DEBUGLEVEL 2
#endif
/* debug levels 调试级别*/
#define CRITICAL 0 //数字越小级别越高,打印的信息log越少
#define ALWAYS 0
#define INFO 1
#define SPEW 2
/* output */ 输出方式介绍
void _dputc(char c); // XXX for now, platform implements 平台工具
int _dputs(const char *str);
int _dprintf(const char *fmt, ...) __PRINTFLIKE(1, 2);
int _dvprintf(const char *fmt, va_list ap);
//下面的这些打印方法具体含义是:如果级别<=之前定义的调试级别的话就打印否则不打印
#define dputc(level, str) do { if ((level) <= DEBUGLEVEL) { _dputc(str); } } while (0)
#define dputs(level, str) do { if ((level) <= DEBUGLEVEL) { _dputs(str); } } while (0)
#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)
#define dvprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dvprintf(x); } } while (0)
二、kernel层:
在kernel-3.18\include\linux\kern_levels.h中定义了打印级别:
(以前定义在kernel-3.18\include\linux\kernel.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 默认的内核loglevel----一般都为4*/
在kernel-3.18\include\linux\printk.h中定义了各默认日志的级别
/* printk's without a loglevel use this.. 没有日志级别的printk使用*/
#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT
/* We show everything that is MORE important than this..我们展示了所有比这更重要的东西 */
#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_MOTORMOUTH 15 /* You can't shut this one up */
extern int console_printk[];
#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
在这里注意一下:有些人在写printk()时,并不加log级别,这是如果我们定义的log级别小于4,则它是打印不出来的,因为不写log级别的打印内核默认为4打印级别。
在kernel-3.18\kernel\printk\printk.c中:
int console_printk[4] = {
CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel控制log级别 */
MESSAGE_LOGLEVEL_DEFAULT, /* default_message_loglevel默认的消息日志级别 */
CONSOLE_LOGLEVEL_MIN, /* minimum_console_loglevel最低的控制台日志级别*/
CONSOLE_LOGLEVEL_DEFAULT, /* default_console_loglevel默认的控制台日志级别 */
};