printk在内部如何工作?


10

我知道printf操作系统需要帮助才能完成其工作。

我也知道printf在Linux源代码中不起作用,因为没有库。因此,我们需要printk进行调试。

那么,printk当操作系统仍在引导时,如何工作?

Answers:


11

该参考文献似乎对您的问题有解答,标题为:Linux Kernel Development Second Edition

摘抄

printk()

内核打印函数的printk()行为几乎与C库printf()函数相同。确实,在本书中,我们并未利用任何实际差异。对于大多数意图来说,这很好。printk()只是内核格式化打印功能的名称。但是确实有一些差异。

printk()的健壮性

printk()快速被视为理所当然的一个特性是它的鲁棒性。该printk()函数可以随时从内核中的几乎任何地方调用。可以从中断或进程上下文中调用它。持有锁时可以调用它。可以在多个处理器上同时调用它,但是不需要调用者持有锁。

这是一种弹性功能。这很重要,因为printk()休息的用处在于它始终存在并且始终有效的事实。

printk()的鲁棒性

在盔甲的缝隙printk()的稳健性确实存在。在控制台启动之前,在内核引导过程中的某个点之前,它是不可用的。的确,如果未初始化控制台,则输出应该放在哪里?

这通常不是问题,除非您在引导过程的早期就调试问题(例如,在中setup_arch(),它执行特定于体系结构的初始化)。首先,这种调试是一个挑战,并且缺少任何类型的打印方法只会使问题更加复杂。

有一些希望,但没有很多。核心架构黑客使用确实有效的硬件(例如,串行端口)与外界进行通信。相信我,这对大多数人来说并不好玩。一些受支持的体系结构确实实现了合理的解决方案,但是,其他(包括i386)具有可用的补丁程序,这些补丁程序也可以节省时间。

该解决方案是一种printk()变体,可以在引导过程的早期就输出到控制台:early_printk()。行为与相同printk(),只是名称和更早的工作能力得以更改。但是,这不是便携式解决方案,因为并非所有受支持的体系结构都实现了这种方法。如果可以的话,它可能成为您最好的朋友。

除非您需要在引导过程的早期就写入控制台,否则您可以依靠它printk()始终工作。


4

当OS仍在引导时,printK如何工作?

printk()尽可能进入控制台,并且优先级足够高;我不确定内核在何时初始化VT使其可行,但显然还为时过早。

[src]/kernel/printk/printk.c有充分的记录。控制台访问似乎通过信号量来控制。消息也被注入/dev/dmsg,而不考虑优先级。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.