- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
通常 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()
函数。例如:
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/
通常 printk 不会在 start_kernel 中出现的 console_init 之前打印任何消息。但是启用 early_printk 后,printk 会在控制台初始化之前开始打印消息。现在
我是一名优秀的程序员,十分优秀!