gpt4 book ai didi

linux - 启用 early_printk 后 Printk 行为发生变化

转载 作者:IT王子 更新时间:2023-10-29 00:33:20 27 4
gpt4 key购买 nike

通常 printk 不会在 start_kernel 中出现的 console_init 之前打印任何消息。但是启用 early_printk 后,printk 会在控制台初始化之前开始打印消息。现在 printk 的这种行为如何改变,因为我仍在使用 printk 函数来打印调试消息,而不是 early_printk 函数。这个映射是如何完成的?

最佳答案

这不是真正的映射。当启用 early_printk 时,使用与以前相同的 printk(),在这种情况下只注册新的引导控制台,并且 printk() 在早期启动阶段使用它。

arch/arm/kernel/early_printk.c .你可以看到:

  • 正在使用 register_console() 函数注册新控制台
  • 该控制台具有 CON_BOOT 标志,因此一旦注册了真正的控制台,它就会自动注销
  • 打印通过 early_write() 函数进行,该函数又使用 printch() 函数,该函数分别为每个平台实现

Where in kernel source the early_console is disabled after kernel console initialization?

register_console() 中完成功能:

if (bcon &&
((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
!keep_bootcon) {
/* We need to iterate through all boot consoles, to make
* sure we print everything out, before we unregister them.
*/
for_each_console(bcon)
if (bcon->flags & CON_BOOT)
unregister_console(bcon);
}

上面代码中的 unregister_console() 函数禁用所有启动控制台(当注册真实控制台时)。

And where is the real console getting registered?

真实控制台使用相同的方法进行注册 -- register_console() 函数。例如:

  • 从我的开发板的 defconfig 文件 (arch/arm/configs/omap2plus_defconfig) 我可以看到我的开发板正在使用 CONFIG_SERIAL_8250 作为真正的控制台
  • 我们可以搜索在我的串行驱动程序中执行 register_console() 的位置;它在 univ8250_console_init() 中完成功能

Is there any way to keep boot consoles up after console initialization and disable real console?

仅当注册了真实控制台时,引导控制台才会自动取消注册。按照这个逻辑,您只需要禁用真正的控制台,以保持启动控制台的完整性。

因此,您需要做的是找出在您的情况下哪个驱动程序用于真正的控制台。您可以查看您的 .config 文件或您的开发板的 *_defconfig 文件。一旦找到它,只需在配置中禁用该驱动程序并重建内核。

如果在这样做之后你一直观察到一些真实控制台的注册,你需要在 register_console() 中添加一些调试打印,以找出正在注册的驱动程序,然后在你的配置。

关于linux - 启用 early_printk 后 Printk 行为发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41632166/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com