在启用early_printk的情况下更改Printk行为

时间:2017-01-13 10:15:50

标签: linux linux-kernel arm linux-device-driver

通常if let randomClass = controlClass as? RandomClass { /* Codes */ } 不会在printk中出现console_init之前的任何消息。但是在启用start_kernel的情况下,early_printk会在控制台初始化之前开始打印消息。现在printk的这种行为如何改变,因为我仍然使用printk函数来打印调试消息而不是printk函数。这个映射是如何完成的?

1 个答案:

答案 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文件或您的电路板的*_defconfig文件。找到它后,只需在配置中禁用该驱动程序并重建内核。

如果这样做后你继续观察一些真正的控制台的注册,你需要向register_console()添加一些调试打印,找出正在注册的驱动程序,然后在你的配置中禁用它。