Answers:
该参考文献似乎对您的问题有解答,标题为:Linux Kernel Development Second Edition。
摘抄
printk()
内核打印函数的
printk()
行为几乎与C库printf()
函数相同。确实,在本书中,我们并未利用任何实际差异。对于大多数意图来说,这很好。printk()
只是内核格式化打印功能的名称。但是确实有一些差异。printk()的健壮性
printk()
快速被视为理所当然的一个特性是它的鲁棒性。该printk()
函数可以随时从内核中的几乎任何地方调用。可以从中断或进程上下文中调用它。持有锁时可以调用它。可以在多个处理器上同时调用它,但是不需要调用者持有锁。这是一种弹性功能。这很重要,因为
printk()
休息的用处在于它始终存在并且始终有效的事实。printk()的鲁棒性
在盔甲的缝隙
printk()
的稳健性确实存在。在控制台启动之前,在内核引导过程中的某个点之前,它是不可用的。的确,如果未初始化控制台,则输出应该放在哪里?这通常不是问题,除非您在引导过程的早期就调试问题(例如,在中
setup_arch()
,它执行特定于体系结构的初始化)。首先,这种调试是一个挑战,并且缺少任何类型的打印方法只会使问题更加复杂。有一些希望,但没有很多。核心架构黑客使用确实有效的硬件(例如,串行端口)与外界进行通信。相信我,这对大多数人来说并不好玩。一些受支持的体系结构确实实现了合理的解决方案,但是,其他(包括i386)具有可用的补丁程序,这些补丁程序也可以节省时间。
该解决方案是一种
printk()
变体,可以在引导过程的早期就输出到控制台:early_printk()
。行为与相同printk()
,只是名称和更早的工作能力得以更改。但是,这不是便携式解决方案,因为并非所有受支持的体系结构都实现了这种方法。如果可以的话,它可能成为您最好的朋友。除非您需要在引导过程的早期就写入控制台,否则您可以依靠它
printk()
始终工作。