カーネルマーカーは、 Linuxカーネルソースコードにおける静的カーネルインストルメンテーション支援機構であり、 LTTng [1]やSystemTap [2]などの特殊なツールがこれらのプローブポイントによって露出される情報を追跡することを可能にする。カーネルマーカーは、カーネルコード内で以下の形式のワンライナーによって宣言される。
trace_mark (名前,フォーマット文字列, ... );
ここで、nameはマーカーの一意の名前であり、format_string は残りの引数の型を記述します。
マーカーは、プローブが接続されているかどうかに応じてオンまたはオフになります。トレースポイントにフックするコードは、まず以下を呼び出します。
int marker_probe_register ( const char * name 、const char * format_string 、marker_probe_func * probe 、void * pdata );
プローブコールバックをマーカーポイントに登録します( pdata はコードがプローブに渡すプライベートデータ値です)。その後、プローブのオン/オフは次のように行います。
int marker_arm ( const char * name ); int marker_disarm ( const char * name );
マーカーの使用は、メモリ参照を使用せずに動的にオン/オフを切り替えることができるスイッチをコード内に埋め込む別のサポートメカニズムであるイミディエイト値[ 3]のおかげで、オーバーヘッドがごくわずかです。これにより、キャッシュラインが節約されます。[4]
この静的インストルメンテーション基盤を最初に構築した動機は、ブレークポイントに依存する従来の動的インストルメンテーション機構であるKprobeメカニズムによって、パフォーマンスに大きなオーバーヘッドが発生していたことです。また、静的インストルメンテーションは、マーカーがソースコード内に存在するため、ソースコードの変更にも比較的容易に対応できます。
カーネルマーカーは、基本的にCプリプロセスマクロで構成されており、インストルメントされた関数に関数呼び出しへの分岐を追加します。これにより、インストルメンテーションが有効になっていない場合、スタックセットアップも関数呼び出しも実行されません。スタックセットアップと関数呼び出しを実行する分岐をunlikely(gcc組み込み関数を使用して)として識別することにより、コンパイラexpect()にヒントが与えられ、標準的なカーネル実行に関係するキャッシュラインからトレース命令を離して配置します。[5]
カーネルマーカーには2つの欠点があることが分かり[5] 、トレースポイントに置き換えられました。
- APIが書式文字列に基づいているため、型検証はスカラー型に限定されていました。これは、トレーサーコードでポインタを逆参照する必要がある場合に問題を引き起こす可能性があります。
- マーカーはソースコード内のインストルメンテーションを「隠蔽」し、インストルメンテーションのグローバルレジストリを保持しません。そのため、カーネルツリー全体を監視していない限り、名前空間の規則やインストルメンテーションの変更の追跡は困難になります。
これらを実装したパッチセットは、2008年1月24日にリリースされたバージョン2.6.24 [6]に統合されました。カーネルマーカーに関する問題を解決するために、原作者のMathieu Desnoyersは、より単純で型安全な静的プローブポイントであるTracepointsを実装しました。Tracepointsを実装したパッチセットは、2008年12月25日にリリースされたバージョン2.6.28 [7]に統合されました。それ以降、カーネルマーカーはカーネルソースから徐々に削除され、最終的には2009年12月3日にリリースされたLinuxカーネル2.6.32 [8] [9]で完全に削除されました。
参照
参考文献
- ^ トレースポイントとマーカー Archived 2009-09-23 at the Wayback Machine、LTTng's Tracing Wiki
- ^ マーカーの使用、SystemTap Wiki
- ^ Mathieu Desnoyers、[パッチ 08/10] Immediate Value - ドキュメント[永久リンク切れ]
- ^ Mathieu Desnoyers、[パッチ 7/8] Immediate Values - Documentation [ permanent dead link ]
- ^ ab Mathieu Desnoyers、低影響オペレーティング システム トレース、博士論文、情報科学および論理学部門、モントリオール工科大学、モントリオール大学、2009 年 12 月
- ^ Linux 2.6.24 変更ログ、Linux カーネル初心者
- ^ Linux 2.6.28 変更ログ、Linux カーネル初心者
- ^ Linux 2.6.32 変更ログ、Linux カーネル初心者
- ^ Christoph Hellwig, fc537766 2013年4月15日アーカイブarchive.todayトレース: マーカーの削除、TorvaldsのLinux gitツリー
外部リンク
- ジョナサン・コーベット「カーネルマーカー」、LWN.net、2007年
- Mathieu Desnoyers、「Linux カーネルマーカーの使用」、Linux カーネルドキュメント、2008 年
- ジョナサン・コーベット『トレーシング:選択肢は豊富』LWN.net、2008年