0

私のすべてのドライバーコードは現在これを行っています。これは主に、以前にWindowsカーネルチームで15年間働いていた非常に上級のドライバープログラマーと一緒に働いていて、彼がそれを要求したためです。私はその習慣を身につけ、「なぜ」という質問を実際にしたことはありませんでした。

非ページプールはページに比べて少なく、ターゲットシステムについて推測できない(使用可能な非ページメモリの量など)などの明らかな理由を知っています。しかし、最近、私のドライバーコードを使い始めた多数のLinuxドライバープログラマーを継承し(Linuxにはそのような区別はないようです)、コード/データを常にページプールに入れる必要があると言ったとき、彼らは一斉に立ち上がった可能。

では、ページング/非ページングプールの割り当てを行う本当の理由は何ですか?

4

1 に答える 1

4

つまり、Windowsは、カーネル割り当てをページングすることにより、メモリ消費を最小限に抑えようとします。

長いバージョン:ページ化されていない割り当ては、割り当てが解除されるまで物理メモリに残しておく必要があります。したがって、これらの割り当ては仮想アドレス空間と物理メモリを消費します。32ビットシステムでは仮想アドレスが非常に制限されているため、ドライバーの割り当ては不足しているスペースから行われます(割り当てはグローバルであるため)。64ビットWindowsシステムでは、かなりのVAスペースがあるため、これは特に問題にはなりません。

ただし、すべての割り当ては引き続き物​​理メモリを使用します。したがって、ユーザーが使用できないメモリ。これは小さい可能性があります(現在私のマシンでは約2.5%)。これらの割り当ては累積的であるため、VM環境で実行する場合はさらに懸念が生じます。したがって、非ページ割り当てを減らすと、より多くのVMインスタンスを物理マシンで実行できるようになります。

ページ割り当てはディスクにページングできるため、PASSIVEおよびAPCレベルでのみアクセスできます。そうしないと、Windowsが上位のIRQLでページフォールトを処理できないため、ブルースクリーンが表示される場合があります。

再現するには:

  1. ドライバーがDPC以上のIRQLで動作している場合は、コード/データをこれらのレベルに必要なセクションに適切に分割し、非ページ化してください。
  2. ドライバーがIRQLを変更せず、割り込みも取らない場合は、すべての割り当てをページングして、適切な市民にし、物理的なメモリ使用量を最小限に抑えます。
于 2010-09-28T20:25:26.293 に答える