我正在开发嵌入式 Linux (kernel-5.10.24),并且我在内核配置中启用了 Early_printk 以帮助我调试内核。
正常情况下,内核命令行已经设置了console=ttyS0,115200 ....
,我可以在内核中看到早期的 printk 日志。
但是今天,我错误地将命令行更改为console=ttyS1,115200 ....
,并且我认为在内核启动期间不会看到任何内核日志。
令我惊讶的是,我仍然可以看到早期 printk 完成的内核日志的第一部分,之后就没有其他日志了。
所以我的问题是如何早期 printk 输出内核日志到right
控制台,即使console=
设置为不存在的设备(或错误的串行控制台)?
答案1
考虑到控制台启动参数的值,我假设您的终端通过某些串行线连接到系统。
printk 输出内核如何早期记录到正确的控制台,即使 console= 设置为不存在的设备
原因很简单……终端早期启动消息将在某些终端上输出,无论安慰启动参数值但由早期印刷而是启动参数。
这安慰启动参数仅确定“真实”控制台。 vg 一旦标准 Linux 驱动程序正确初始化(也就是说在 init 阶段开始时),该终端将用作控制台。
如果您的设置错误,那么从逻辑上讲,启动时间后系统控制台上将不会有任何输出。
Linux 中内核 Early_printk 的控制台设置是什么?
正如您可以阅读的内核的命令行参数:
earlyprintk=vgaearlyprintk
=sclpearlyprintk
=xenearlyprintk
=串行[,ttySn[,波特率]]
earlyprintk=串行[,0x...[,波特率]]
earlyprintk=ttySn[,波特率]
earlyprintk=dbgp[debugController#]
earlyprintk= pciserial[,force],bus:device.function[,波特率]
Earlyprintk=xdbc[xhciController#]当内核在正常控制台初始化之前崩溃时,earlyprintk 很有用。默认情况下不启用它,因为它存在一些外观问题。
附加“,keep”以在真正的控制台接管时不禁用它。
一次只能使用 vga、efi、串行或 USB 调试端口之一。
目前只有 ttyS0 和 ttyS1 可以通过名称指定。其他 I/O 端口可以在某些体系结构(至少是 x86 和 ARM)上通过用 I/O 端口地址替换 ttySn 来显式指定,如下所示:earlyprintk=serial,0x1008,115200 您可以在/proc/tty/driver/serial: 2: uart:ST16650V2 端口:00001008 irq:18 ...
与标准串行驱动程序的交互不是很好。
VGA和EFI输出最终会被真实控制台覆盖。
xen 输出只能由 Xen PV 来宾使用。
sclp 输出只能在 s390 上使用。
即使 PCI 设备的类代码不属于 UART 类,可选的“强制”为“pciserial”也可以使用 PCI 设备。