如何知道有多少物理 Ram 将 imdisk 分配给 ramdisk
Posted
技术标签:
【中文标题】如何知道有多少物理 Ram 将 imdisk 分配给 ramdisk【英文标题】:How to know how much physical Ram allocates imdisk to a ramdisk 【发布时间】:2011-01-24 09:30:42 【问题描述】:最近我在使用 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" 我想知道这个 ramdisk 需要多少物理 Ram。 但似乎这取决于 ramdisk 是如何填充文件的。它从几 MB 开始,然后随着我复制的每个文件而增加。 如果我随后删除这些文件,则它所占用的物理 RAM 量不会减少。 所以我不能使用 GetDiskFreeSpaceEx 来获取物理内存的数量,因为它不会正确显示。 此外,我无法将程序的驱动程序视为普通程序,因此我可以测量其大小。
我和作者谈过,他说:
好的,你说的是身体 记忆。我在谈论内核 地址空间。 ImDisk 分配所有 一次存储在一个地址中 内存磁盘块,所以没有 动态分配或类似的东西 那个。
我认为唯一的方法是 确定多少物理内存 这个地址空间使用一个 如果有特定的时刻 一些报告的未记录 API 提交/物理值 特定的内存块。我不知道 然而,任何此类 API。
但也许有人知道方法... 我的意思是在程序中得到这个数字,而不仅仅是视觉上。
【问题讨论】:
@David 好的,我会尝试... 你不是很努力!! ;-) 【参考方案1】:查看源代码,ImDisk 似乎在 System 进程的上下文中分配内存。查看 System 的工作集(例如使用 Process Explorer)- 其中应该是 ImDisk 的物理内存使用情况。
我在查看源代码之前写的原始答案(如果我的猜测错了可能仍然有用):
对于进程,您可以简单地查看工作集值 - 它们指示该进程的物理内存使用情况。但是,对于不特定于任何进程的内核模式代码,它有点难。你需要的是RAMMap 之类的东西。我说“类似”是因为在“使用计数”和“物理页面”选项卡中,几乎不可能知道页面实际来自哪里(谁分配了它们)。
编辑:
抱歉,我没有意识到您想以编程方式执行此操作。如果您想获取进程的工作集大小,请致电GetProcessMemoryInfo。所以只需打开系统进程(PID 4)并调用该函数。
我的第二部分的意思是,我不知道内核对任何内核模式内存分配 API 所做的任何跟踪/跟踪,至少对于查看特定驱动程序的物理内存使用情况。内核如何管理物理页面并不是用户模式或内核模式程序员真正关心的问题。
但是,我确实错过了一些东西,因为 ImDisk 不使用这些 API - 它使用 ZwAllocateVirtualMemory。如果你知道驱动分配的block的地址范围,你可以在System进程上调用QueryWorkingSet,做一些计算得到确切的大小。
【讨论】:
谢谢。这是一个好主意,你有我的投票。但我也想知道如何在程序中获取数量,而不仅仅是在 Process Explorer 中直观地获取。我不能 100% 理解你答案的第二部分,你能详细说明一下吗?以上是关于如何知道有多少物理 Ram 将 imdisk 分配给 ramdisk的主要内容,如果未能解决你的问题,请参考以下文章