1

(カーネルモードで一度)ユーザープロセスのメモリに書き込もうとして、カーネルにシステムコールを動的に(カーネルを再起動してコンパイルせずに)ロードしようとしています。

(ptrace インターフェースでこれを行う方法があることは知っていますが、それはオプションではありません。)

これを行う唯一の方法は、モジュールをロードすることです。ユーザーがそれと通信できるようにするために、キャラクターデバイスを使用するように言われました (これは /dev/ にあるはずですよね?)。1つを正常にロードしました。私の問題は、ユーザープロセスがシステムコールなしでアクセスする方法がわからないことです。(私は ioctl を使用するように言われました) 私のモジュールによってロードされた、たとえばユーザープロセスが ioctl を呼び出す方法を誰かが示すことができますか?

ありがとう、シャイ

4

1 に答える 1

0

以下の回答では、Linux モジュールを開発していると想定しています。あなたの質問を読み直すと、問題を誤解していた可能性があることがわかりました。


カーネル ドライバーと通信するためのメカニズムがいくつかあります。

  • エントリ/proc(別名procfs )
  • デバイス インターフェイスを介したioctl
  • デバイス インターフェイスから直接

最も一般的な手法は、read()および/またはwrite()システム コールを使用してドライバー アクションを引き起こす最後の手法です。これらのシステム コールは通常、純粋なデータを渡しますが、特定のドライバーが代わりに i/o インターフェイスを介してメタデータを渡すことを止めるものは何もありません。

一方、ドライバーが既に有用な純粋なデータ規律を持っていて、メタデータには適していない場合、read()システムコールは、ファイルに関連するあらゆる種類のことを行うための一種の汎用スイス アーミー ナイフです。磁気テープのロードまたはアンロード、DVD の取り出し、ネットワーク カードのイーサネット アドレスの検索、または発生したディスク ドライブ エラーの数の検索。非常に多くのioctl操作コードが定義されているため、目的に合わせて再利用する合理的なものを見つけることができるでしょう。このインターフェイスの大きな欠点は、カスタム プログラムでの使用に最適であるため、標準プログラムのパイプラインに接続されたデータを転送するのが面倒または難しいことです。write()ioctl()ioctlioctl

この/procインターフェイスは、前の 2 つの手法の長所を組み合わせたものです。標準のユーティリティ プログラムでstdin/stdout規則を使用するのに適していますが、通常のドライバー メカニズムを介した I/O から独立したデバイス ドライバーへのインターフェイスも提供します。たとえば、cat /proc/net/tcpLinux システムで試してみてください。TCPすべての接続のステータスが表示されます。

procfs機能の実装に関する優れた記事は にありcreate_proc_entry()ます。ioctl の実装については、こちらで詳しく説明しています。メタデータ アプローチは、他のデバイス ドライバーと同じくらい簡単にコーディングできますが、経験豊富な実装者には概念上のハードルが生じる可能性があります。

于 2011-10-04T22:06:06.607 に答える