プリント

コンテンツへジャンプ
フリー百科事典『ウィキペディア』より
LinuxカーネルのPrintfのような関数

printkLinuxカーネルインターフェースprintfのような関数で、カーネルログエントリのフォーマットと書き込みに使用されます。 [ 1 ] C標準ライブラリ(広く使用されているprintfのような関数を含む)はカーネルモードでは使用できないためカーネル内で汎用出力を提供します。 [ 2 ]カーネル設計の制限により、この関数はカーネルモードソフトウェアのデバッグを支援するためによく使用されます。 [ 1 ]printk

printkブートプロセスの初期段階、システムコンソールが初期化される前を除いて、カーネル内のどこからでも呼び出すことができます。[ 3 ]代替関数はいくつかのアーキテクチャで実装されており、ブートプロセスの初期段階でearly_printk同じように使用されます。 [ 3 ]printk

使用

[編集]

printkは と同じ構文printfを持ちますが、意味が多少異なります。 と同様にprintfprintkは format c-string 引数と値引数のリストを受け入れます。[ 1 ]どちらも入力パラメータと に基づいてテキストをフォーマットし、動作は非常に似ていますが、大きな違いもあります。[ 1 ]printk 関数のプロトタイプのプロトタイプと一致するprintf)は次のとおりです。

int printk ( const char * format , ...);    

と異なる特徴をprintf以下に説明します。

ログレベル

[編集]

printk呼び出し側はログレベル(送信するメッセージの種類と重要度)を指定できます。レベルは、ログレベルを示すテキストを先頭に追加することで指定します。通常、このテキストはC言語の文字列リテラル連結と、この目的のために設計されたマクロのいずれかを介して先頭に追加されます。例えば、情報レベルでログに記録されるメッセージは、次のように記述できます。[ 1 ]

printk ( KERN_INFO "メッセージ: %s" , arg )  

ログレベルを指定するテキストは、ASCII SOH文字に続いてログレベルを識別する数字、またはメッセージが前のメッセージの続きであることを示す文字「c」で構成されます。[ 1 ] [ 4 ]次の表は、各ログレベルとその標準的な意味を示しています。[ 3 ]

0 KERN_EMERG 緊急事態。システムはおそらく機能していない
1 KERN_ALERT すぐに対処する必要がある問題
2 KERN_CRIT 危機的な状況
3 KERN_ERR エラー
4 KERN_警告 警告
5 KERN_NOTICE 正常だが、おそらく注目すべき状態
6 カーネル情報 情報メッセージ
7 KERN_DEBUG デバッグメッセージ

ログレベルが指定されていない場合、エントリはデフォルトのレベル(通常はKERN_WARNING)でログに記録されますが、[ 1 ] loglevel=ブート引数などを使用して設定することもできます[ 5 ]

ログレベルはヘッダーファイル<linux/kern_levels.h>で定義されています。[ 4 ]どのログレベルを出力するかはsysctlファイル/proc/sys/kernel/printkを使って設定します[ 1 ]

ポインタ形式

[編集]

%pでサポートされているフォーマット指定子はprintf追加のフォーマットモードによって拡張されています。例えば、をstruct sockaddr *使用してを印刷するように要求すると、 %pISpcIPv4/v6アドレスとポートが次のように人間に分かりやすい形式でフォーマットされます。1.2.3.4:12345または[1:2:3:4:5:6:7:8]: 12345. [ 6 ]

浮動小数点サポートなし

[編集]

浮動小数点数のprintfフォーマットをサポートしていますが、 [ 6 ] Linuxカーネルはカーネルコードで浮動小数点数の使用を許可していないためサポートしていません。(浮動小数点数の使用には、整数のみのコードと比較して、追加のレジスタとステータスフラグの保存と復元が必要です。)[ 7 ]printk

実装

[編集]

この関数は、Linuxシステムコンソールへのアクセスを制御するセマフォをロックしようとします[ 1 ] [ 8 ]成功した場合、出力がログに記録され、コンソールドライバーが呼び出されます。[ 1 ]セマフォを取得できない場合は、出力がログバッファに配置され、コンソールセマフォの現在の所有者は、コンソールセマフォを解放するときに新しい出力を認識し、セマフォを解放する前にバッファリングされた出力をコンソールに送信します。[ 1 ]

この遅延印刷の影響の一つとして、出力printkすべきログレベルを呼び出してから変更するコードが動作しなくなる可能性がある。これは、出力すべきログレベルが実際の出力時に検査されるためである。[ 1 ]

参考文献

[編集]
  1. ^ a b c d e f g h i j k l 「printkによるメッセージログ — Linuxカーネルドキュメント」 www.kernel.org . 2020年9月9日閲覧
  2. ^ ISO/IEC 9899:2018 . 国際標準化機構. 2018年.
  3. ^ a b c "printk()" . archive.is . 2007年8月30日. 2007年8月30日時点のオリジナルよりアーカイブ。 2020年9月9日閲覧
  4. ^ a b "kern_levels.h" . GitHub . 2020年9月27日閲覧
  5. ^ 「カーネルのコマンドラインパラメータ」 . kernel.org . 2023年9月27日閲覧。
  6. ^ a b 「printkフォーマット指定子を正しく取得する方法 - Linuxカーネルドキュメント」 www.kernel.org . 2020年9月9日閲覧
  7. ^ “Re: Linuxカーネルと浮動小数点” . www.redhat.com . 2019年7月21日時点のオリジナルよりアーカイブ2020年9月9日閲覧。
  8. ^ 「ドライバーの基本 - Linuxカーネルドキュメント」www.kernel.org . 2020年9月9日閲覧
[編集]

プリント

LinuxカーネルのPrintfのような関数

printkLinuxカーネルインターフェースprintfのような関数で、カーネルログエントリのフォーマットと書き込みに使用されます。 [1] C標準ライブラリ(広く普及しているprintfのような関数を含む)はカーネルモードでは利用できないためカーネル内で汎用出力を提供します。 [2]カーネル設計の制限により、この関数はカーネルモードソフトウェアのデバッグを支援するためによく使用されます。 [1]printk

printkブートプロセスの初期段階、システムコンソールが初期化される前を除いて、カーネル内のどこからでも呼び出すことができます。[3]代替関数は一部のアーキテクチャで実装されており、ブートプロセスの初期段階でearly_printk同じように使用されます。 [3]printk

使用

printkは と同じ構文printfを持ちますが、意味が多少異なります。 と同様にprintfprintkは format c-string 引数と値引数のリストを受け入れます。[1]どちらも入力パラメータとに基づいてテキストをフォーマットし、動作は非常に似ていますが、大きな違いもあります。[1]printk 関数のプロトタイプのプロトタイプと一致するprintf)は次のとおりです。

int printk ( const char * format , ...);    

と異なる特徴をprintf以下に説明します。

ログレベル

printk呼び出し側はログレベル(送信するメッセージの種類と重要度)を指定できます。レベルは、ログレベルを示すテキストを先頭に追加することで指定します。通常、テキストはC言語の文字列リテラル連結と、この目的のために設計されたマクロのいずれかを介して先頭に追加されます。例えば、メッセージは情報レベルで次のようにログ出力されます。[1]

printk ( KERN_INFO "メッセージ: %s" , arg )  

ログレベルを指定するテキストは、ASCII SOH文字に続いてログレベルを識別する数字、またはメッセージが前のメッセージの続きであることを示す文字「c」で構成されます。[1] [4]次の表は、各ログレベルとその標準的な意味を示しています。[3]

0 KERN_EMERG 緊急事態。システムはおそらく機能していない
1 KERN_ALERT すぐに対処する必要がある問題
2 KERN_CRIT 危機的な状況
3 KERN_ERR エラー
4 KERN_警告 警告
5 KERN_NOTICE 正常だが、おそらく注目すべき状態
6 カーネル情報 情報メッセージ
7 KERN_DEBUG デバッグメッセージ

ログレベルが指定されていない場合、エントリはデフォルトのレベル(通常はKERN_WARNING)でログに記録されますが、[1] loglevel=ブート引数などを使用して設定することもできます[5]

ログレベルはヘッダーファイル<linux/kern_levels.h>で定義されています。[4]どのログレベルを出力するかは、 sysctlファイル/proc/sys/kernel/printkを使って設定します[1]

ポインタ形式

%pでサポートされているフォーマット指定子はprintf追加のフォーマットモードによって拡張されています。例えば、をstruct sockaddr *使用してを印刷するように要求すると、 %pISpcIPv4/v6アドレスとポートが次のように人間に分かりやすい形式でフォーマットされます。1.2.3.4:12345または[1:2:3:4:5:6:7:8]: 12345. [6]

浮動小数点サポートなし

浮動小数点printf数のフォーマットをサポートしています、 Linuxカーネルではカーネルコード内での浮動小数点数の使用を許可していないため、サポートしていません。 [6](浮動小数点数を使用する場合、整数のみのコードと比較して、追加のレジスタとステータスフラグの保存と復元が必要になります。)[7]printk

実装

この関数は、Linuxシステムコンソールへのアクセスを制御するセマフォをロックしようとします[1] [8]成功した場合、出力がログに記録され、コンソールドライバーが呼び出されます。[1]セマフォを取得できない場合、出力はログバッファに格納され、コンソールセマフォの現在の所有者は、コンソールセマフォを解放したときに新しい出力を認識し、セマフォを解放する前にバッファリングされた出力をコンソールに送信します。[1]

この遅延印刷の影響の一つとして、printkログ出力レベルを呼び出してから変更するコードが動作しなくなる可能性がある。これは、出力すべきログ出力レベルが実際の出力時に検査されるためである。[1]

参考文献

  1. ^ abcdefghijkl 「printkによるメッセージログ — Linuxカーネルドキュメント」www.kernel.org . 2020年9月9日閲覧
  2. ^ ISO/IEC 9899:2018 . 国際標準化機構. 2018年.
  3. ^ abc "printk()". archive.is . 2007年8月30日. 2007年8月30日時点のオリジナルよりアーカイブ。 2020年9月9日閲覧
  4. ^ ab "kern_levels.h". GitHub . 2020年9月27日閲覧
  5. ^ 「カーネルのコマンドラインパラメータ」. kernel.org . 2023年9月27日閲覧。
  6. ^ ab 「printkフォーマット指定子を正しく取得する方法 — Linuxカーネルドキュメント」www.kernel.org . 2020年9月9日閲覧
  7. ^ “Re: Linuxカーネルと浮動小数点”. www.redhat.com . 2019年7月21日時点のオリジナルよりアーカイブ2020年9月9日閲覧。
  8. ^ 「ドライバーの基本 - Linuxカーネルドキュメント」www.kernel.org . 2020年9月9日閲覧
  • printk 形式のリファレンス
「https://en.wikipedia.org/w/index.php?title=Printk&oldid=1328131600」から取得
Original text
Rate this translation
Your feedback will be used to help improve Google Translate