10

KEXT では、vnode またはファイル スコープ リスナーを介してファイル クローズをリッスンしています。特定の (ごく少数の) ファイルについては、システム デーモンにファイル パスを送信する必要があります。システム デーモンは何らかの処理を行い (これはデーモンで実行する必要があります)、結果を KEXT に返します。デーモンからの応答が得られるまで、ファイルを閉じる呼び出しをブロックする必要があります。結果に基づいて、クローズコールでいくつかの操作を行い、クローズコールを正常に返す必要があります。フォーラムでは、KEXT 通信関連のトピックについて多くの議論が行われています。しかし、それらは決定的なものではなく、非常に古いもの (2002 年ごろ) のようです。この要件は、FtlSendMessage(...)Win32 API で処理できます。Macで同等のものを探しています

これが私が見たものであり、私の理解を要約したいと思います:

  1. マッハ メッセージ: キューイング メカニズムを備えた送信側ポートと応答ポートを使用して、双方向通信の非常に優れた方法を提供します。ただし、マッハ メッセージ API (例: mach_msg、 ) は KPImach_port_allocatebootstrap_look_upはないようです。mach APIを使用mach_msg_send_from_kernelできますが、それだけでは双方向通信には役立ちません。私の理解は正しいですか?
  2. IOUserClient : これは、ユーザー空間から KEXT への通信と、KEXT からのいくつかのコールバックに関連しているようです。KEXT からデーモンへの通信を開始し、デーモンからの結果を待つ方法が見つかりませんでした。何か不足していますか?
  3. Sockets : KEXT から Daemon への双方向通信チャネル全体を実装する必要があるため、これが最後のオプションになる可能性があります。
  4. ioctl/ sysctl: 私は彼らについてあまり知りません。私が読んだことから、特に双方向通信には推奨されないオプションです
  5. RPC-Mig : 繰り返しますが、私はそれらについてあまり知りません。私が見たものから複雑に見えます。これが推奨される方法かどうかはわかりません。
  6. KUNCUserNotification : これは、KEXT からユーザーに通知を提供しているだけのようです。それは私の要件を満たしていません。

サポートされているプラ​​ットフォームは (10.5 以降) です。要件を見て、誰かがこのトピックに関するいくつかの指針を提案して提供できますか?

前もって感謝します。

4

3 に答える 3

4

そのプロセスに使用したパターンは、ユーザー空間プロセスに KEXT へのソケット接続を開始させることです。KEXT は、そのソケットを介してメッセージを処理する新しいスレッドを作成し、スレッドをスリープ状態にします。KEXT は、応答する必要があるイベントを検出すると、メッセージング スレッドを起動し、既存のソケットを使用してデータをデーモンに送信します。応答を受信すると、要求元のスレッドに制御が戻され、操作を拒否するかどうかが決定されます。

そのパターン全体を完全に説明している単一のリソースは知りませんが、関連する KPI についてはMac OS X Internals (古いようですが、KPI は書かれてからあまり変わっていません) とOS X で説明されています。 iOS カーネル プログラミング(私がテクニカル レビュアーを務めていました)。

于 2012-04-25T06:59:44.650 に答える
1

価値があるのは、autofsが「RPC-Mig」の意味を使用しているため、それほど複雑ではありませ( MIGは RPC 呼び出しを記述するために使用され、それが生成するスタブ コードは、適切な Mach メッセージの送受信の呼び出しを処理しますコード; カーネル モード スタブを生成するための特別なオプションがあります)。

ただし、automountd (autofs kext がメッセージを送信するユーザーモードデーモン) には「ホスト特殊ポート」が割り当てられているため、ルックアップを行う必要はありません。任意のサービスを見つけるためにルックアップを行うのは困難です。

于 2013-02-28T18:37:56.933 に答える
0

KExt 側で確立されたソケットを使用する場合はctl_register()、注意してください: kext からユーザー空間への通信 ( 経由ctl_enqueuedata()) は正常に機能します。ただし、10.5.x および 10.6.x では反対方向にバグがあります。

ドメイン内で約 70.000 または 80.000 回のsend()呼び出しを行った後SOCK_DGRAMPF_SYSTEM完全なネット スタックが破損し、システム全体に悲惨な結果をもたらします (ハード オフにすることが唯一の解決策です)。これは 10.7.0 で修正されました。setsockopt()非常に小さなデータのみを送信するため (一部の操作を許可/禁止するため)、ユーザー空間から kext への方向にプロジェクトで使用することで回避します。

于 2012-05-24T14:28:46.253 に答える