2011-01-24 11 views
1

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

私は著者に話し、彼は言う:

さて、あなたは物理 メモリを話していました。私はカーネル のアドレス空間について話していました。 ImDiskは、 メモリを1つのアドレスにまとめて割り当てます。 ブロックはRAMディスクのため、 の動的割り当てまたはそれ以外のものは です。

私は への唯一の方法は が 特定のメモリ・ブロックのために/物理的な値をコミット報告するいくつかの文書化されていないAPI がある場合は、このアドレス空間は次のようになり1つの 特定の瞬間に使用していますどのくらいの物理メモリ 決定と思うだろう。しかし、私はこのようなAPIのどれも を知らない。

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

+0

@David ok、私は試してみてください... –

+0

あなたはとても大変です! ;-) –

答えて

3

ImDiskは、システムプロセスのコンテキストでメモリを割り当てるように見えます。システムのワーキングセット(例えば、Process Explorerを使用)を見てください。その範囲内では、ImDiskの物理メモリ使用量である必要があります。

私は、ソースコード(私の推測が間違っている場合は、まだ使用のものであってもよい)を見て前に私が書いた私のオリジナルの答え:プロセスでは

あなたは、単に作業の設定値を見てみることができ - 彼らが示していますそのプロセスの物理メモリ使用量しかし、どのプロセスにも固有ではないカーネルモードのコードでは、少し難しくなります。あなたが必要なものはRAMMapのようなものです。 Use CountsとPhysical Pagesタブでは、実際にページがどこから来ているのか(誰が割り当てているのか)を知ることはほとんど不可能になるので、私は「何かのように」と言います。

編集:

申し訳ありませんが、私はあなたがこれをプログラムやってみたかった実現しませんでした。プロセスのワーキングセットサイズを取得する場合は、GetProcessMemoryInfoに電話してください。システムプロセス(PID 4)を開き、その関数を呼び出してください。

2番目の部分は、カーネルモードのメモリ割り当てAPIで、特定のドライバの物理メモリの使用状況を確認するために、カーネルが行ったトラッキング/トレースを認識していないことです。カーネルが物理ページをどのように管理しているかは、ユーザーモードやカーネルモードのプログラマが心配するものではありません。

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

+0

ありがとうございます。それは良いアイデアだと私の投票を持っています。しかし、プロセスエクスプローラだけではなく、プログラム内の金額を取得する方法も知りたいと思っています。私はあなたの答えの2番目の部分を100%理解できません、少し精巧にできますか? –

関連する問題