![Linux 上堆栈可以交换到磁盘吗?可以阻止吗](https://linux22.com/image/118742/Linux%20%E4%B8%8A%E5%A0%86%E6%A0%88%E5%8F%AF%E4%BB%A5%E4%BA%A4%E6%8D%A2%E5%88%B0%E7%A3%81%E7%9B%98%E5%90%97%EF%BC%9F%E5%8F%AF%E4%BB%A5%E9%98%BB%E6%AD%A2%E5%90%97.png)
在 Linux 上,包含进程堆栈的内存页是否有可能交换到磁盘?如果是这样,有没有办法在编译时或运行时防止这种情况发生。
我之所以问这个问题是因为 GitHub 上有一个关于可能会从堆栈上的局部变量泄漏秘密
如果这个问题的答案不仅取决于内核,还取决于所使用的用户空间工具链(libc、动态链接器等),那么我的问题尤其是关于 GNU/Linux 和 Android 的。
答案1
在 Linux 上,几乎所有进程的内存都可以被换出,包括其堆和堆栈。
然而,可以将内存页面锁定到物理 RAM 中,以便它们无法被换出。这是使用以下方法完成的mlock
系统调用(或mlockall
锁定进程的所有内存)。这是一个特权操作,因此该进程需要具有适当的能力CAP_IPC_LOCK
(请参阅gnome-keyring-daemon
示例:/sbin/getcap /usr/bin/gnome-keyring-daemon
)。