回答:
このリファレンスには、Linux Kernel Development Second Editionというタイトルの質問に対する回答があるようです。
抜粋
printk()
カーネルプリント関数は
printk()
、Cライブラリprintf()
関数とほぼ同じように動作します。実際、この本全体を通して、私たちは実際の違いを利用していません。ほとんどの場合、これは問題ありません。printk()
カーネルのフォーマットされた印刷関数の名前です。ただし、いくつかの違いがあります。printk()の堅牢性
printk()
すぐに当たり前と思われる特性の1つは、その堅牢性です。このprintk()
関数は、カーネルのほぼどこからでもいつでも呼び出すことができます。割り込みまたはプロセスコンテキストから呼び出すことができます。ロックが保持されているときに呼び出すことができます。複数のプロセッサで同時に呼び出すことができますが、呼び出し元がロックを保持する必要はありません。弾力性のある機能です。これが重要なのは、その有用性
printk()
は常に存在し、常に機能するという事実にかかっているためです。printk()の非堅牢性
printk()
の堅牢性の鎧の隙間が存在します。カーネルブートプロセスの特定の時点の前、コンソールの初期化前は使用できません。確かに、コンソールが初期化されていない場合、出力はどこに行くはずですか?ブートプロセスの非常に早い段階で問題をデバッグしている場合(たとえば、
setup_arch()
アーキテクチャ固有の初期化を実行するでは)を除いて、これは通常問題ではありません。このようなデバッグはそもそも課題であり、印刷方法が何もないため、問題がさらに悪化します。希望はありますが、多くはありません。ハードコアアーキテクチャのハッカーは、外界と通信するために機能するハードウェア(たとえば、シリアルポート)を使用します。これはほとんどの人にとって楽しいものではありません。一部のサポートされているアーキテクチャは、まともなソリューションを実装していますが、他のアーキテクチャ(i386を含む)には、その日を節約するパッチも用意されています。
ソリューションは
printk()
、起動プロセスの非常に早い段階でコンソールに出力できるバリアントですearly_printk()
。動作はと同じですが、printk()
名前と以前に機能する機能のみが変更されています。ただし、サポートされているすべてのアーキテクチャにそのようなメソッドが実装されているわけではないため、これはポータブルソリューションではありません。もしそうなら、それはあなたの親友になるかもしれません。起動プロセスの非常に早い段階でコンソールに書き込む必要がない限り
printk()
、常に動作することを信頼できます。