在 Linux 上,包含进程堆栈的内存页是否有可能交换到磁盘?如果是这样,有没有办法在编译时或运行时防止这种情况发生。
我之所以问这个问题是因为 GitHub 上有一个关于可能会从堆栈上的局部变量泄漏秘密
如果这个问题的答案不仅取决于内核,还取决于所使用的用户空间工具链(libc、动态链接器等),那么我的问题尤其是关于 GNU/Linux 和 Android 的。
答案1
在 Linux 上,几乎所有进程的内存都可以被换出,包括其堆和堆栈。
然而,可以将内存页面锁定到物理 RAM 中,以便它们无法被换出。这是使用以下方法完成的mlock
系统调用(或mlockall
锁定进程的所有内存)。这是一个特权操作,因此该进程需要具有适当的能力CAP_IPC_LOCK
(请参阅gnome-keyring-daemon
示例:/sbin/getcap /usr/bin/gnome-keyring-daemon
)。