1

最近、私は imdisk http://www.ltr-data.se/opencode.html/#ImDiskを使用しています。 次のコマンドで 1 GB の RAM ディスクを作成しています: imdisk.exe -a -t vm -m V: -s 1024M -p "/fs:NTFS /q /y /v:Name /c" この RAM ディスクの物理 RAM の容量を知りたいです。しかし、それはラムディスクがファイルでどのように満たされているかに依存しているようです. 数MBから始まり、コピーするファイルごとに増加します。これらのファイルを削除しても、必要な物理 RAM の量は減りません。そのため、正しく表示されないため、GetDiskFreeSpaceEx を使用して物理 RAM の量を取得することはできません。また、プログラムのドライバーを通常のプログラムとして見ることができないため、そのサイズを測定できました。

著者と話をしたところ、彼は次のように述べています。

さて、あなたは物理メモリについて話していました。カーネルアドレス空間について話していました。ImDisk は、RAM ディスクの 1 つのアドレス ブロックにすべてのメモリを一度に割り当てるため、動的な割り当てなどはありません。

このアドレス空間が特定の瞬間に使用する物理メモリの量を判断する唯一の方法は、特定のメモリ ブロックのコミット/物理値を報告する文書化されていない API がある場合だと思います。ただし、そのようなAPIは知りません。

しかし、誰かが方法を知っているかもしれません...視覚的にだけでなく、プログラムでその数を取得することを意味します。

4

1 に答える 1

3

ソース コードを調べると、ImDisk は System プロセスのコンテキストでメモリを割り当てているようです。システムのワーキング セットを見てください (たとえば、 Process Explorerを使用)。その中には、ImDisk の物理メモリ使用量が含まれているはずです。

ソースコードを見る前に書いた私の元の答え(私の推測が間違っていてもまだ使えるかもしれません):

プロセスについては、ワーキング セットの値を確認するだけで済みます。これらは、そのプロセスの物理メモリの使用量を示しています。ただし、どのプロセスにも固有ではないカーネル モード コードの場合は、少し難しくなります。必要なのはRAMMapのようなものです。「使用数」タブと「物理ページ」タブでは、ページが実際にどこから来たのか (誰が割り当てたのか) を知ることはほとんど不可能になるため、「何か」と言います。

編集:

申し訳ありませんが、あなたがこれをプログラムで行いたいとは思いませんでした。プロセスのワーキング セットのサイズを取得する場合は、GetProcessMemoryInfoを呼び出します。したがって、システム プロセス (PID 4) を開いて、その関数を呼び出すだけです。

2 番目の部分で意味したことは、少なくとも特定のドライバーの物理メモリ使用量を表示するために、カーネル モードのメモリ割り当て API のいずれかに対してカーネルによって行われた追跡/トレースを認識していないということです。カーネルが物理ページをどのように管理するかは、ユーザー モードまたはカーネル モードのプログラマーが実際に心配することではありません。

ただし、ImDisk はこれらの API を使用せず、ZwAllocateVirtualMemory を使用するため、ここで何かを見逃していました。ドライバーによって割り当てられたブロックのアドレス範囲がわかっている場合は、システム プロセスでQueryWorkingSetを呼び出し、計算を行って正確なサイズを取得できます。

于 2011-01-24T10:13:32.357 に答える