防止 RAM 分页到交换区 (mlock)
Prevent RAM from paging to swap area (mlock)
有没有办法从 Python 调用 the POSIX mlock
function? mlock
的作用是禁止换出某些对象。
我知道在保护加密密钥方面还有其他问题,我只是想知道如何将它们包含在 RAM 中。
对于 CPython,没有不涉及编写 Python C 扩展的好的答案,因为 mlock
适用于页面,而不是对象。即使您使用 ctypes
检索必要的地址并通过 ctypes
mlock
调用对它们全部进行 mlock
编辑,您也会花很多时间来确定何时 mlock
以及何时 munlock
。您需要知道所有受保护数据类型的内存地址和大小;由于 mlock
在页面上工作,您必须仔细跟踪任何给定页面中当前有多少对象(因为如果您只是盲目地 mlock
和 munlock
,并且有不止一个页面中要锁定的东西,第一个 munlock
将解锁所有这些东西;mlock/munlock
是一个布尔标志,它不计算锁定和解锁的次数。
即使您做到了这一点,您仍然会在数据采集和 mlock
之间进行竞争,在此期间可以将数据写入交换。
您可以通过仔细使用 mmap
模块和 memoryview
s 来部分避免这些问题(mmap
为您提供内存页,memoryview
引用所述内存而不复制它,因此 ctypes
可用于 mlock
页面),但您必须从头开始构建它。
简而言之,Python 不会按照您想要的方式关心交换或内存保护;它信任将交换文件配置为您所需的安全性(例如禁用或加密),既不提供额外保护也不提供您需要添加它的信息。
有没有办法从 Python 调用 the POSIX mlock
function? mlock
的作用是禁止换出某些对象。
我知道在保护加密密钥方面还有其他问题,我只是想知道如何将它们包含在 RAM 中。
对于 CPython,没有不涉及编写 Python C 扩展的好的答案,因为 mlock
适用于页面,而不是对象。即使您使用 ctypes
检索必要的地址并通过 ctypes
mlock
调用对它们全部进行 mlock
编辑,您也会花很多时间来确定何时 mlock
以及何时 munlock
。您需要知道所有受保护数据类型的内存地址和大小;由于 mlock
在页面上工作,您必须仔细跟踪任何给定页面中当前有多少对象(因为如果您只是盲目地 mlock
和 munlock
,并且有不止一个页面中要锁定的东西,第一个 munlock
将解锁所有这些东西;mlock/munlock
是一个布尔标志,它不计算锁定和解锁的次数。
即使您做到了这一点,您仍然会在数据采集和 mlock
之间进行竞争,在此期间可以将数据写入交换。
您可以通过仔细使用 mmap
模块和 memoryview
s 来部分避免这些问题(mmap
为您提供内存页,memoryview
引用所述内存而不复制它,因此 ctypes
可用于 mlock
页面),但您必须从头开始构建它。
简而言之,Python 不会按照您想要的方式关心交换或内存保护;它信任将交换文件配置为您所需的安全性(例如禁用或加密),既不提供额外保护也不提供您需要添加它的信息。