【发布时间】:2018-04-05 15:44:22
【问题描述】:
出于安全考虑,我目前正在研究如何避免在程序执行期间交换某些数据块。
据我搜索,我在 Linux 上找到了 mlock,这似乎正是我需要的工具,在 Windows 上找到了 VirtualLock。
对于后者,我发现了不同的意见。 the documentation 表示
进程已锁定的页面保留在物理内存中,直到进程解锁或终止。
但是,人们似乎不同意并声称VirtualLock only lock the memory in the working set of the process,因此只要程序的至少一个线程正在运行,内存就不会被交换。这意味着,无论出于何种原因,每个线程都被阻塞,数据可能会被换出。
谁能为我澄清这一点? 如果文档确实有误,这只是理论上的风险,还是我应该认真考虑?我可以使用什么解决方案真正将内存锁定在 RAM 中?
如果有帮助,我的目标是确定在加密应用程序中擦除内存的好做法和坏做法
编辑:this article 回答问题,肯定是锁在内存中。然而它提出了另一个问题:如何摆脱缓存问题?我最终可能会得到多个数据副本...
【问题讨论】:
-
我认为这可以解释:每个版本的 Windows 对进程可以锁定的最大页面数都有限制。这个限制是故意很小的,以避免严重的性能下降。需要锁定大量页面的应用程序必须首先调用 SetProcessWorkingSetSize 函数来增加它们的最小和最大工作集大小。进程可以锁定的最大页数等于其最小工作集中的页数减去一个小开销。
-
除了交换之外,您还需要担心休眠或混合睡眠会将 RAM 内容保存到磁盘。
-
你为什么要打扰?在用户模式下,anything 会延迟您的进程,而不仅仅是内存页面被换出。如果您需要实时性能,则需要进入内核模式。
-
@drescherjm 它并没有真正回答我的问题,我知道这个限制,但是我的阅读(我在我的帖子中添加了一个链接),但这不是我的意思。我担心 VirtualLock 在“锁定”内存时会做什么。
-
@IanAbbott 我知道休眠问题,我一定会检查混合睡眠,感谢您指出这一点。