以下の回答では、Linux モジュールを開発していると想定しています。あなたの質問を読み直すと、問題を誤解していた可能性があることがわかりました。
カーネル ドライバーと通信するためのメカニズムがいくつかあります。
- エントリ
/proc
(別名procfs )
- デバイス インターフェイスを介したioctl
- デバイス インターフェイスから直接
最も一般的な手法は、read()
および/またはwrite()
システム コールを使用してドライバー アクションを引き起こす最後の手法です。これらのシステム コールは通常、純粋なデータを渡しますが、特定のドライバーが代わりに i/o インターフェイスを介してメタデータを渡すことを止めるものは何もありません。
一方、ドライバーが既に有用な純粋なデータ規律を持っていて、メタデータには適していない場合、read()
システムコールは、ファイルに関連するあらゆる種類のことを行うための一種の汎用スイス アーミー ナイフです。磁気テープのロードまたはアンロード、DVD の取り出し、ネットワーク カードのイーサネット アドレスの検索、または発生したディスク ドライブ エラーの数の検索。非常に多くのioctl操作コードが定義されているため、目的に合わせて再利用する合理的なものを見つけることができるでしょう。このインターフェイスの大きな欠点は、カスタム プログラムでの使用に最適であるため、標準プログラムのパイプラインに接続されたデータを転送するのが面倒または難しいことです。write()
ioctl()
ioctl
ioctl
この/proc
インターフェイスは、前の 2 つの手法の長所を組み合わせたものです。標準のユーティリティ プログラムでstdin
/stdout
規則を使用するのに適していますが、通常のドライバー メカニズムを介した I/O から独立したデバイス ドライバーへのインターフェイスも提供します。たとえば、cat /proc/net/tcp
Linux システムで試してみてください。TCP
すべての接続のステータスが表示されます。
procfs機能の実装に関する優れた記事は にありcreate_proc_entry()
ます。ioctl の実装については、こちらで詳しく説明しています。メタデータ アプローチは、他のデバイス ドライバーと同じくらい簡単にコーディングできますが、経験豊富な実装者には概念上のハードルが生じる可能性があります。