内核中的早期 printk 似乎没有按预期工作

内核中的早期 printk 似乎没有按预期工作

我正在开发嵌入式Linux系统(kernel-5.10.24),并且我想尽早获取内核日志,因此我启用了CONFIG_EARLY_PRINTK内核配置。

当使用U-boot启动内核时,我得到的第一个内核日志不是内核横幅,而是如下,

....
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

Starting kernel ...

[    2.243226] printk: console [ttyS0] enabled
[    2.247565] printk: bootconsole [early0] disabled
......

看来早期的 printk 并没有像我预期的那样工作。
内核命令行如下,

console=ttyS0,115200 loglevel=8 init=/bin/bash root=ubi0:rootfs log_buf_len=32K

内核是否需要任何特定配置才能尽早打印其日志?

答案1

CONFIG_EARLY_PRINTK选项的帮助文本说:

如果您想拥有一个使用内核低级调试功能的早期控制台,请在此处选 Y。添加earlyprintk到您的内核参数启用此控制台。

您的内核命令行不包含该earlyprintk参数。尝试添加一下吗?

另外,用于 ARM 的 Early_printk.c使用printascii()函数,这似乎受到该CONFIG_DEBUG_UART_FLOW_CONTROL选项的影响。如果设置了该选项,您的串行控制台电缆是否向嵌入式系统提供 CTS 流控制信号?

似乎没有任何UART初始化代码,因此波特率和其他设置可能仍然是u-boot设置的值。

答案2

感谢 telcoM 分享他的评论,这给了我深入了解 Earlyprintk 内部的提示。

然后,我想通了。
earlyprintk驱动程序被硬编码为使用第一个串行控制台,该控制台在我的系统中未连接(它使用另一个串行端口),因此通过更改代码以使用正确的串行端口,earlyprintk可以按预期工作。

接下来,我将检查是否可以配置串行端口earlyprintk而不是硬编码。

相关内容