如何知道有多少物理Ram将imdisk分配给ramdisk

时间:2011-01-24 09:30:42

标签: winapi memory device-driver ramdisk

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

我和作者谈过,他说:

  

好的,你说的是体力   记忆。我在谈论内核   地址空间。 ImDisk分配全部   在一个地址中同时存储内存   阻止ram磁盘,所以没有   动态分配或类似的东西   这一点。

     

我认为这是唯一的方法   确定物理内存量   这个地址空间用于一个   如果有的话,那将是特别的时刻   报告的一些未记录的API   提交/物理值   特定的内存块。我不知道   但是,任何此类API。

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

1 个答案:

答案 0 :(得分:3)

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

我在查看源代码之前写的原始答案(如果我的猜测错误,可能仍然有用):

对于进程,您可以简单地查看工作集值 - 它们指示该进程的物理内存使用情况。但是,对于不特定于任何进程的内核模式代码,它有点难度。你需要的是RAMMap之类的东西。我说“类似”,因为在“使用计数”和“物理页面”选项卡中,几乎不可能知道页面实际来自哪里(谁分配了它们)。

编辑:

抱歉,我没有意识到您想以编程方式执行此操作。如果要获取流程的工作集大小,请致电GetProcessMemoryInfo。所以只需打开系统进程(PID 4)并调用该函数。

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

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