1

32 ビット Windows 7 環境で PCI Express ボードに問題があります。このボードは、32 の個別の SD アナログ ビデオ チャネルのリアルタイム H.264 エンコーディングを実行するオーディオ/ビデオ キャプチャ デバイスです。DMA を使用して、圧縮されたフレームを Win7 ホスト ドライバーに配信します。

システムの起動時に、ボード ドライバーは、DmaAdapter オブジェクトの AllocateCommonBuffer 関数を使用して、非ページ プールから DMA バッファーを割り当てます。ボードにマップするには、すべてのバッファが同じ 256MB の物理アドレス範囲に存在する必要があります。この割り当ては、win7 ホスト システムの起動時に常に成功します。

ボードには、単純なブートローダー以外の常駐ファームウェアはありません。アプリケーションの実行時にファームウェア イメージを (ドライバーを介して) ボードにダウンロードする必要があります。ただし、このファームウェアのダウンロード プロセスの一環として、Windows アプリケーションはドライバーを介して BOARD_RESET ioctl を発行し、ボードを既知の状態にする必要があります。残念ながら、ボードがリセット コマンドを受信すると、SURPRISE_REMOVAL イベントが発生したと考える win7 PnP マネージャーのビューから一時的に「消え」ます。その後、ボード ドライバーは、割り当てられたすべての DMA バッファーを強制的に解放して非ページ プールに戻し、PnP マネージャーからの StartDevice イベントを待機します。

次の StartDevice イベントを受信すると、ボード ドライバーは DMA 割り当てを完了できなくなります。断片化が原因で、同じ物理アドレス範囲にマップできる十分なバッファを非ページ プールから見つけることができません。ドライバーは StartDevice イベントに失敗し、PnP マネージャーによってサービスから削除されます。

この状況に対するプログラムによる回避策を探しています。ボードのリセット中に何らかの方法でデバイス ノードを一時停止することは可能ですか? PnP マネージャーはそれを削除として検出しませんか? デバイスの削除検出をオーバーライドできる PnP 構成はありますか? ドライバーが最初に起動したときに正常に取得した DMA バッファーを保持する方法はありますか? このドライバーだけが使用できるように、非ページ プールのページ範囲を予約する方法はありますか? DMA バッファはかなり大きく、それぞれ 634880 バイトの 200 個のバッファがあり、それらはすべて同じ 256MB の範囲 (つまり、0x10000000 境界) から来る必要があります。ボード ドライバーの完全なソース コードがあり、必要な変更を加えることができます。これは、ベンダーから購入したリファレンス デザインの一部です。これは、Windows デバイス ドライバーに初めて触れたときです。

4

0 に答える 0