テクニカル ドキュメント #58



Doc ID: 58
製品: WinDriver
Version:  --

WD_DMALock() の呼び出しで、1GB DMA バッファの割り当てに失敗します。Windows でも同様です。これは、OS の制限でしょうか?

WinDriver は、WD_DMALock() 関数で割り当てることができる DMA バッファのサイズに制限を持っていません。ただし、DMA 割り当ての成功は、割り当て時の利用可能なシステム リソースの大きさに依存します。[このため、バッファを早期に割り当てれば、成功します]。

連続バッファ DMA 割り当ての場合、割り当てのために十分な連続物理メモリが必要です。
Scatter/Gather DMA を実行する場合、1MB 以上のバッファを割り当てる際に、WD_DMALock() 関数へ渡される WD_DMA 構造体の dwOptions フィールドに DMA_LARGE_BUFFER フラグを設定してください。

WD_DMALock() 関数で割り当てられた DMA バッファは、ページロック メモリを使用します (安全な DMA 操作を行います)。ページロック メモリは、Windows のメモリの非ページ カーネル プールから割り当てられます。
このプールのサイズは、起動時にレジスタの設定で決まります。
NonPagedPoolSize レジストリ エントリの値を増やすことによって、割り当てるメモリを増やすことができます: HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Control\Session Manager\Memory Management 以下にあります。

十分に連続メモリがある場合もありますが、メモリをマップするのに十分なページ テーブル エントリがない場合、テクニカル ドキュメント #59 を参照してください。

関連するレジストリのエントリの値を増やした後でも、特に大きなバッファ (1MB など) を割り当てようとすると、メモリの割り当てでエラーが発生する場合があります。この場合の解決策としては、成功するまで、ロックするバッファのサイズを減らしてみてください。

注意: WD_DMALock() はまた、割り当てられたバッファの物理メモリを仮想ユーザー モード スペースにマップします。このため、マップする全体のバッファを有効にするのに、十分な空き仮想メモリが必要です。