1

PCI デバイスで発生したユーザー空間でエラーをログに記録するコードを書いています (カーネルは既にカーネル リング バッファーにログを記録しています)。現在、目の前に2つのアプローチがあり、

  1. (eventfd を使用して) ユーザー空間プロセスに割り込みを送信するようにカーネル デバイス ドライバーを変更し、(select() または poll() を使用して) この割り込みを受信すると、ioctl を使用して詳細なエラー情報を取得できます (デバイス ドライバーの変更が必要になります)。 )。これには、避けたいカーネルコードの変更が必要です。

  2. 私のプロセスはルートとして実行されるため、sysfs を使用してデバイスのエラー ステータス レジスタを読み書きできます。このためには、常にレジスタをポーリングする必要があり、エラーが発生したら、ステータス レジスタを読み取ってデコードし、詳細なエラー情報を取得して、レジスタをクリアします。

ユーザー空間でのみ変更が必要なため、2 番目のアプローチに傾倒しています。

私の質問は次のとおりです。

  1. 2番目のアプローチは理にかなっていますか?
  2. もしそうなら、両方のアプローチの長所と短所は何ですか?
  3. 2 番目の方法でポーリングを行うと、CPU サイクルが浪費されます。最初のアプローチで select() または poll() を使用すると、同様の割合で CPU サイクルが浪費されますか。

役立つ回答をいただければ幸いです。:)

4

2 に答える 2

1
  1. 2 番目のアプローチは醜悪な方法です。あなたの特定の状況でそれが理にかなっているかどうかは、あなただけが決めることができるものです.

  2. ハードウェアアクセスをカプセル化して制御するのは、ドライバーの目的です。2 番目の方法では、ドライバーとプロセスの両方が、もう一方がデバイスに干渉する可能性があることを認識している必要があります。

    あなたは、カーネルコードの変更を「避けたい」と言っています。理由は言いません。その理由は合理的かもしれませんし、そうでないかもしれません。

  3. ループでデバイスをポーリングすると、ドライバーは CPU を浪費します。割り込みにより、CPU はスリープできます。

于 2013-10-25T08:17:33.000 に答える