3

非常にパフォーマンスに敏感なドライバー コードにトレース/ログ フックを挿入するための、オーバーヘッドが最も少ない方法を探しています。このログ記録は常にコンパイルする必要がありますが、ほとんどの場合何もしません (しかし何も高速に行いません)。

グローバルなオン/オフ ワードを使用してif(enabled){log()}. ただし、可能であれば、フックの 1 つをヒットするたびにその単語をロードするコストを回避したいと考えています。これには自己変更コードを使用できる可能性があると思います。つまり、トレース関数を呼び出す場所はどこでも、フックを無効にしたい場合はジャンプを NOP で上書きし、必要な場合はジャンプを置き換えます。それらを有効にします。

簡単なグーグルは、これに関する先行技術を発見しません - 誰かがそれをしましたか? 私が予見していない主要な障害はありますか?

(Linux、x86_64)

4

4 に答える 4

4

コンパイルされたドライバーが突然2倍になっても問題ありませんか?

2つのコードパスを作成します。1つはロギングあり、もう1つはロギングなしです。グローバル関数ポインタを使用して、パフォーマンスに敏感なセクションにジャンプし、必要に応じて上書きします。

于 2010-12-29T01:33:55.197 に答える
4

はい、この手法は、まったく同じ目的 (トレース フック) で Linux カーネル内に実装されています。

開始点については、Jump ラベルに関する LWN の記事を参照してください。

大きな障害はありませんが、小さな障害がいくつかあります。インコヒーレントな命令キャッシュ (すべてのコアで I キャッシュがフラッシュされていることを確認する必要があります)。

于 2010-12-29T04:31:47.740 に答える
0

何らかの方法でレジスタをグローバルに宣言する方法があれば、外部からドライバへのすべてのエントリポイントでワードの値をレジスタにロードしてから、レジスタをチェックすることができます。もちろん、オプティマイザへのそのレジスタの使用を拒否することになります。これにより、パフォーマンスに不快な結果が生じる可能性があります。

于 2010-12-29T01:26:30.210 に答える
0

これが可能かどうかという問題についてはあまり書いていませんが、何か重要なことが得られるかどうかについては書いていません。

一方では、ロギングの可能性が現れるたびに「ロギング有効」をテストしたくないし、他方では「ロギング有効」をテストして、コードを yes または no のコードで上書きする必要があります。または、ドライバーは、前回は no であり、今回は no が要求されたので、何もする必要がないことを「覚えています」か?

必要なロジックは、毎回テストするのに比べて簡単ではないようです。

于 2011-01-24T03:32:24.200 に答える