3

Windows 10 (64 ビット) でカーネル モード ドライバーを作成しています。その主な目的は DMA から読み取ることです。メモリのブロックをカーネル空間からユーザー空間に割り当てられたバッファーにコピーする代わりに、何らかの方法でアドレスをユーザー空間に公開し (もちろん物理アドレスではありません)、メモリ コピー操作を節約できます。

おそらく次のようなものです:

  1. 連続した物理メモリのブロックを割り当てます (そして物理アドレスをカーネル空間の仮想アドレスにマッピングします)。

  2. カーネル空間の仮想アドレスをユーザー空間の仮想アドレスにマッピングします。

ところで、カーネル空間は 1 つしかなく、システムで実行中のプロセスと同じ数のユーザー空間があるため (正しいですか?)、取得するには、呼び出しプロセスへの何らかのハンドルを使用する必要があります。適切なプロセスの仮想アドレス...

御時間ありがとうございます!

4

1 に答える 1

1

(2)については、AccessMode = UserMode のMmMapLockedPagesSpecifyCache()はどうですか。「ルーチンは、ドライバーが実行されているプロセスのコンテキストで有効なユーザー アドレスを返します」という重要な警告に注意してください。つまり、DeviceIoControl() などのユーザー モード コードからの呼び出しを直接処理するドライバー コードでマッピングを実行します。また、この関数を使用するには、物理​​ページを記述する MDL を提供する必要があり、それらのページをロックダウンする必要があることに注意してください。

于 2017-08-09T17:46:13.367 に答える