2011-01-24 53 views
1

最近我使用的是imdisk http://www.ltr-data.se/opencode.html/#ImDisk 我正在用这个命令创建一个1 GB的虚拟硬盘:imdisk.exe -a -t vm -m V:-s 1024M - p“/ fs:NTFS/q/y/v:Name/c” 我想知道有多少物理RAM需要这个虚拟硬盘。 但它看起来取决于虚拟磁盘如何填充文件。它从几MB开始,然后随着每个我复制的文件而增加。 如果我然后删除这些文件,它所需的物理Ram的数量不会减少。 所以我不能使用GetDiskFreeSpaceEx来获取物理Ram的数量,因为它不会正确显示。 另外我看不到程序的驱动程序作为一个正常的程序,所以我可以测量它的大小。如何知道有多少物理RAM分配imdisk到虚拟硬盘

我跟作者,他说:

好吧,你在谈论物理内存 。我在谈论内核地址空间 。 ImDisk将所有 内存一次分配到一个单一地址的 块中,因此没有 动态分配或类似 那样的内存。

我会想,为了 的唯一途径确定此地址空间物理内存多大 使用在一个 特定时刻是,如果有 一些未公开的API,报告 提交/物理值的 特定的内存块。但我不知道任何这样的API的 。

但也许有人知道一种方式... 我的意思是在程序中获取该数字,而不只是在视觉上。

+0

@大卫好吧,我会试试... – 2011-01-24 10:09:25

+0

你不是很努力! ;-) – 2011-01-24 12:33:15

回答

3

翻阅源代码,看起来ImDisk在系统进程的上下文中分配内存。看一下System的工作集(例如使用Process Explorer) - 在这里应该是ImDisk的物理内存使用情况。

我之前,我看了看源代码,我写了原来的答复(可能还是用的,如果我的猜测是错误的):

对于流程,您可以简单地看一看在工作中设置的值 - 它们表示该进程的物理内存使用情况。但是,对于不是特定于任何进程的内核模式代码,这有点困难。你需要的是类似RAMMap。我说“类似的东西”,因为在使用计数和物理页面标签中几乎不可能告诉页面实际来自哪里(谁分配它们)。

编辑:

对不起,我没有意识到你想以编程方式做到这一点。如果你想获得一个进程的工作集大小,请致电GetProcessMemoryInfo。所以只需打开系统进程(PID 4)并调用该函数即可。

我的意思是第二部分是我不知道内核对任何内核模式内存分配API执行的任何跟踪/跟踪,至少对于查看特定驱动程序的物理内存使用情况。内核如何管理物理页面并不真正是用户模式或内核模式程序员担心的问题。

但是,我确实在这里错过了一些东西,因为ImDisk不使用这些API--它使用ZwAllocateVirtualMemory。如果您知道驱动程序分配的块的地址范围,则可以在系统进程上调用QueryWorkingSet并进行一些计算以获得确切的大小。