1

最近我正在使用 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 来获取物理内存的数量,因为它不会正确显示。此外,我无法将程序的驱动程序视为普通程序,因此我可以测量其大小。

我和作者谈过,他说:

好吧,你说的是物理内存。我在谈论内核地址空间。ImDisk 一次在一个地址块中为 ram 磁盘分配所有内存,因此没有动态分配或类似的东西。

我认为确定该地址空间在某个特定时刻使用多少物理内存的唯一方法是,如果有一些未记录的 API 报告特定内存块的提交/物理值。但是,我不知道任何此类 API。

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

4

1 回答 1

3

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

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

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

编辑:

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

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

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

于 2011-01-24T10:13:32.357 回答