本文以ARM为例
一、功能说明
printk的log输出是由console实现(会在其他文章中说明)。由于在kernel刚启动的过程中,还没有为串口等设备等注册console(在device probe阶段实现),此时无法通过正常的console来输出log。
为此,linux提供了early console机制,用于实现为设备注册console之前的早期log的输出,对应console也称为boot console,简称bcon。这个console在kernel启动的早期阶段就会被注册,主要通过输出设备(比如串口设备)的简单的write方法直接进行数据打印。而这个write方法也就是平台实现。
注意,这时候作为输出的串口设备是基于bootloader中已经初始化完成的。
early console机制有两种实现方式,早期的early_printk实现和后面的earlycon实现。在这里主要说明early_printk的实现方式.
early_printk与earlycon相比较为落后,其差异可以参考《earlycon实现流程》文章,建议使用earlycon的实现方式来做early console功能
二、需要打开的宏,如何使能
1、需要打开的宏
CONFIG_DEBUG_LL
ENTRY(printch)定义在arch/arm/debug.S中,需要用这个宏来打开。
CONFIG_EARLY_PRINTK
setup_early_printk的定义。解析cmdline中的early_printk参数并安装boot console。
early_printk输出函数的定义。
2、如何使能
在cmdline中添加“earlyprintk”字符串,如下:
"console=ttySAC0,115200n8 root=/dev/mmcblk0p1 rw rootwait ignore_loglevel earlyprintk"
三、如何使用
1、printascii、printk、early_print、early_printk的区别。
2、在setup.c中加对应例子并打印
比如:
printascii("early_printk success")
early_printk("early_printk success");
printk("printk success")
early_print("early_print success")
(1)printascii(不建议使用)
(2)early_printk
(3)pr