printkは内部的にどのように機能しますか?


10

printfはその仕事をするためにOSの助けが必要であることを知っています。

printfライブラリがないため、Linuxソースコードでは機能しないことも知っています。そしてprintkデバッグのためにあります。

printkOSがまだ起動している場合、どのように機能しますか?

回答:


11

このリファレンスには、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()、常に動作することを信頼できます。


4

OSがまだ起動している場合、printKはどのように機能しますか?

printk()可能であればコンソールに移動し、優先度は十分に高いです。カーネルがどの時点でVTを初期化して実行可能にするかはわかりませんが、明らかにかなり早い段階です。

[src]/kernel/printk/printk.cかなりよく文書化されています。コンソールアクセスはセマフォを介して制御されているようです。/dev/dmsg優先度に関係なく、メッセージもに挿入されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.