通常if let randomClass = controlClass as? RandomClass {
/* Codes */
}
不会在printk
中出现console_init
之前的任何消息。但是在启用start_kernel
的情况下,early_printk
会在控制台初始化之前开始打印消息。现在printk
的这种行为如何改变,因为我仍然使用printk
函数来打印调试消息而不是printk
函数。这个映射是如何完成的?
答案 0 :(得分:2)
它不是真正的映射。启用early_printk
时,使用与以前相同的printk()
,在这种情况下只注册新的启动控制台,printk()
在早期启动阶段使用它。
看看arch/arm/kernel/early_printk.c。你可以看到:
register_console()
功能CON_BOOT
标志,因此只要注册了真正的控制台,它就会自动取消注册early_write()
函数进行,后者又使用printch()
函数,该函数分别为每个平台实现在内核源代码中,
early_console
在内核控制台初始化后被禁用?
在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()
函数禁用了所有启动控制台(正在注册真正的控制台时)。
真正的控制台在哪里注册?
真实控制台使用相同的方法进行注册 - register_console()
功能。例如:
CONFIG_SERIAL_8250
作为真正的控制台register_console()
的位置;它已在univ8250_console_init()函数在控制台初始化和禁用真实控制台后,有没有办法让启动控制台保持正常状态?
仅在注册真实控制台时,才会自动取消注册引导控制台。遵循这个逻辑,您只需要禁用真正的控制台,以保持启动控制台完好无损。
所以你需要做的是找出在你的情况下哪个驱动程序用于真正的控制台。您可以查看您的.config
文件或您的电路板的*_defconfig
文件。找到它后,只需在配置中禁用该驱动程序并重建内核。
如果这样做后你继续观察一些真正的控制台的注册,你需要向register_console()
添加一些调试打印,找出正在注册的驱动程序,然后在你的配置中禁用它。