防止 RAM 分页到交换区 (mlock)

Prevent RAM from paging to swap area (mlock)

有没有办法从 Python 调用 the POSIX mlock functionmlock 的作用是禁止换出某些对象。

我知道在保护加密密钥方面还有其他问题,我只是想知道如何将它们包含在 RAM 中。

对于 CPython,没有不涉及编写 Python C 扩展的好的答案,因为 mlock 适用于页面,而不是对象。即使您使用 ctypes 检索必要的地址并通过 ctypes mlock 调用对它们全部进行 mlock 编辑,您也会花很多时间来确定何时 mlock 以及何时 munlock。您需要知道所有受保护数据类型的内存地址和大小;由于 mlock 在页面上工作,您必须仔细跟踪任何给定页面中当前有多少对象(因为如果您只是盲目地 mlockmunlock,并且有不止一个页面中要锁定的东西,第一个 munlock 将解锁所有这些东西;mlock/munlock 是一个布尔标志,它不计算锁定和解锁的次数。

即使您做到了这一点,您仍然会在数据采集和 mlock 之间进行竞争,在此期间可以将数据写入交换。

您可以通过仔细使用 mmap 模块和 memoryviews 来部分避免这些问题(mmap 为您提供内存页,memoryview 引用所述内存而不复制它,因此 ctypes 可用于 mlock 页面),但您必须从头开始构建它。

简而言之,Python 不会按照您想要的方式关心交换或内存保护;它信任将交换文件配置为您所需的安全性(例如禁用或加密),既不提供额外保护也不提供您需要添加它的信息。