問題タブ [driverkit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - OSAction::Cancel ハンドラが呼び出されるのはいつですか?
USB デバイスを処理する Driverkit ドライバーがあります。ドライバーは、USB パケット内のデータをアンパックし、アプリとドライバーの間で共有されるバッファーにデータを書き込みます。共有バッファーは、アプリによってIOConnectCallAsyncMethod
. アプリがバッファーを使用する準備ができると、ドライバーはオブジェクトIOUserClient::AsyncCompletion
を使用して呼び出しOSAction
ます。オブジェクトは、アプリによるOSAction
呼び出しの結果としても作成されますIOConnectCallAsyncMethod
。OSAction
共有バッファーごとに 1 つのオブジェクトがあります。
アプリ内のイベントを処理するメカニズムでエラーが発生した場合、ドライバーにOSAction
オブジェクトの呼び出しを停止するように指示すると、アプリ内のイベントを処理するスレッドが停止します。この時点で、アプリ内のすべてのイベントを処理したかどうか確信が持てません。また、ドライバーにメッセージを送信して再起動するときは、停止前のイベントが処理されるキューにないことを確認したいと考えています。アプリ。
これにより、コールバックがキャンセルされたときに呼び出されるハンドラーOSAction::Cancel
を渡すことができます。このメソッドのドキュメントには、実行中のコールバックの実行が終了した後にシステムが呼び出すハンドラー ブロックが記載されています。
「インフライト」コールバックとはどういう意味ですか?
Cancel
すべてのオブジェクトを呼び出しOSAction
、各オブジェクトのカウンターをデクリメントしてOSAction
、キャンセルの完了を追跡します ( Appleのこのサンプル プロジェクトと同様)。問題は、ブロックが呼び出されたことがわからないことです。
ブロックが呼び出されるのはいつですか? 私が考えることができるいくつかの異なる状況は次のとおりです。
OSAction
に渡されなかったですAsyncCompletion
。OSAction
に渡されましたAsyncCompletion
が、アプリはイベントを処理しませんでした。OSAction
に渡されたAsyncCompletion
。アプリはイベントの処理を開始しましたが、アプリはまだイベントの処理を完了していません。
また、ブロックの呼び出しに使用されるドライバーのディスパッチ キューについても考えています。
c++ - PCIDriverKit を使用して PCI BAR をメモリマップする方法は?
PCIDriverKit ドライバー (DEXT) からユーザー空間アプリケーションに PCI Base Address Register (BAR) をメモリーマップする方法は?
ドライバー拡張機能からアプリケーションへのメモリ マッピングは、ユーザー クライアント サブクラス (ドライバー側) でIOUserClient::CopyClientMemoryForTypeを実装し、 IOConnectMapMemory64を(ユーザー空間アプリケーション側から) 呼び出すことによって実現できます。これは、この関連する回答で非常にうまく完全に説明されています。
唯一欠けているビットは、目的の PCI BAR に対応するIOMemoryDescriptorCopyClientMemoryForType
を取得して、それを実装から返すことです。
サンプルコード
別の言い方をすると、次の単純化されたコードが与えられた場合、 の実装は何になるでしょうimaginaryFunctionWhichReturnsTheBARBuffer
か?
前のコードivars->pciDevice
では、すぐに使用できるIOPCIDeviceを参照しています (例:最新のベスト プラクティスに従って、正常に一致し、開かれ、構成されています)。
これは、さまざまな構成およびメモリの読み取り/書き込み方法を使用して、目的の PCI BAR メモリから明示的なオフセットにアクセスすることが既に可能であることを意味します。欠けている (または不明な) のは、これらの API (または同等の API) を使用して、PCI BARに対応するバッファー全体をユーザー空間アプリケーションにマップする方法です。
関連するかどうかわからないランダムなメモ
関連する質問からのこの回答: DriverKit システム拡張機能にメモリを割り当て、それを別のプロセスにマップする方法は? 次の引用が含まれています。
[...] 返されるメモリ記述子は、例で使用したように IOBufferMemoryDescriptor である必要はありません。PCI BAR などでもかまいません。
これはまさに私がやりたいことなので、少なくとも可能であるように思えます。唯一残っている問題は、それをどのように実装するかです。
同様の質問が Apple フォーラムに投稿されており、(この記事の執筆時点では) まだ回答が得られていませんが、役立つヒントがいくつか含まれています。
次のシグネチャを持つ PCIDriverKit にプライベート関数があるようです。
(文書化されていないため) 正確に何をすべきかを判断するのは困難ですが、署名は私が探している機能と一致しているようです。ただし、これを使用しようとすると、常にエラー コードが返されます (元のフォーラム投稿で報告されたものと同様です)。として渡される引数によってエラーコードが異なるようです
IOService *forClient
)。その投稿のもう 1 つの良い点は、必要なことを達成するために使用できるカーネル拡張機能 (KEXT) で使用できるgetDeviceMemoryWithIndexがあることです (ドライバーが PCI カーネル拡張機能として実装されている場合、これは現在非推奨になっているようです)。
ただし、この機能はドライバー拡張機能 (DEXT) では使用できないようです。したがって、この質問を構成する別の質問は次のようになります:
getDeviceMemoryWithIndex
PCIDriverKit ドライバー拡張機能に相当するものは何ですか?
macos - MacOS FrameBuffer を UserClient として構成する
既存のkextを更新しようとしています。これは単純に を開き、IOFrameBuffer
への呼び出しを介して構成を変更しますsetAttributeForConnection()
。次の呼び出しを介してユーザークライアントとしてフレームバッファーサービスに接続できるため、kextはもう必要ないと思います。
を使用して、単一のプロパティを変更するためにメソッドconnection
を呼び出す必要があると思いますが、 kext呼び出しとIOConnectCallXXX()
同等の呼び出しを行う方法がわかりません 。
これまでのところ、フレーム バッファ接続に関するドキュメントを見つけることができませんでした。connection
への呼び出しによって提供されるを使用して呼び出すことができる関数のリストはありますかIOServiceOpen()