私は現在、Windowsの内部をよりよく理解するために、Windowsカーネルドライバーをいじっています。Toy Project として、プロセス間で共有できるメモリを割り当てる役割を持つカーネル ドライバーを作成しました。
アプリケーションは、任意のサイズのメモリ バッファーを作成するようドライバーに要求できます。次に、ドライバーは MmAllocatePagesForMdl を使用して KernelSpace にこのバッファーを作成し、 MmMapLockedPagesSpecifyCache を使用してユーザー モードでこのバッファーをマップします。結果のポインタはアプリケーションに返され、通常のバッファと同じように直接書き込むことができます。次に、別のアプリケーションがドライバにこのメモリへのアクセスを要求して、メモリを読み取る (または書き込む) ことができます。ドライバーは、新しいプロセスのコンテキストで既存のバッファーに対して MmMapLockedPagesSpecifyCacheを呼び出すだけです。これまでのところ、すべてが非常にうまく機能しています。
この小さな成功の後、カーネル空間により大きなバッファを作成したいと思い、壁にぶつかりました。MDL は「4Go - PAGE_SIZE」までしか管理できません。
私の最初のアイデアは、サイズ要求を満たすまでMmAllocatePagesForMdlを使用していくつかの MDL を作成し、 Nextポインターを使用して MDL をチェーンし、次にMmMapLockedPagesSpecifyCacheを使用してポインターをユーザー空間に返すことでした。しかし、MmMapLockedPagesSpecifyCacheは連鎖 MDL では機能せず、最初の MDL をユーザー空間にマップするだけです。
これまでのところ、4Go を超える連続仮想メモリをカーネル空間からユーザー空間に返す方法は見つかりませんでした。ページングされたメモリを使用するため、カーネル空間での割り当ては問題ではありません。物理メモリは連続している必要はありませんが、それらを連続した仮想メモリにマップしてユーザー空間で使用する方法が見つかりません。
だから私は貪欲になり、それは不可能ですか?それとも、それを行うために何かを逃しましたか?
参考までに、これは 64 ビット専用のドライバーと 64 ビット アプリケーションであるため、ここでは 32 ビットの制限はありません。