最近我使用的是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。
但也许有人知道一种方式...... 我的意思是在程序中获得该数字,而不仅仅是在视觉上。
答案 0 :(得分:3)
查看源代码,ImDisk似乎在系统进程的上下文中分配内存。看一下System的工作集(例如使用Process Explorer) - 其中应该是ImDisk的物理内存使用情况。
我在查看源代码之前写的原始答案(如果我的猜测错误,可能仍然有用):
对于进程,您可以简单地查看工作集值 - 它们指示该进程的物理内存使用情况。但是,对于不特定于任何进程的内核模式代码,它有点难度。你需要的是RAMMap之类的东西。我说“类似”,因为在“使用计数”和“物理页面”选项卡中,几乎不可能知道页面实际来自哪里(谁分配了它们)。
编辑:
抱歉,我没有意识到您想以编程方式执行此操作。如果要获取流程的工作集大小,请致电GetProcessMemoryInfo。所以只需打开系统进程(PID 4)并调用该函数。
第二部分我的意思是我不知道内核为任何内核模式内存分配API做了任何跟踪/跟踪,至少是为了查看特定驱动程序的物理内存使用情况。内核如何管理物理页面并不是用户模式或内核模式程序员所担心的。
但是,我确实错过了一些内容,因为ImDisk不使用这些API - 它使用ZwAllocateVirtualMemory。如果您知道驱动程序分配的块的地址范围,则可以在系统进程上调用QueryWorkingSet并进行一些计算以获得确切的大小。