50.Linux/Unix 系统编程手册(下) -- 虚拟内存操作
1.mprotect()
修改一块虚拟内存区域上的保护信息
如果一个进程在访问一块内存区域时违背了内存保护,内核会发送 SIGSEGV 信号。
2.内存锁: mlock() 和 mlockall()
将一块虚拟内存区域锁进物理内存,从而防止它被交换出去。
将一个进程的虚拟内存的部分或全部锁进内存以确保它们总是位于物理内存中是非常有用的。之所以这样做的一个原因是它可以提高性能。
对被锁住的分页的访问可以确保永远不会因为分页故障而发生延迟。这对于那些需要确保快速响应时间的应用程序来说是很有用的。
给内存加锁的另外一个原因是安全。如果一个包含敏感数据的虚拟内存分页永远不会被交换出去,那么该分页的副本就不会被写入到磁盘。
如果该分页被写入磁盘,那么从理论上来说就可以在后面某个时刻直接从磁盘读取该分页。(攻击者可能会故意通过运行一个消耗大量内存的程序
来构造这种场景,从而强制其他进程占据的内存被交换到磁盘上).由于内核不保证会清除交换空间中保存的数据,因此即使在进程终止之后也可能
从交换空间中读取信息。
内存锁不会通过 fork() 创建的子进程继承,也不会在 exec() 执行期间被保留。
mlock();
munlock();
mlockall();
munlockall();
3.确定内存驻留性: mincore()
让一个进程能够确定一块虚拟内存区域中的分页是否驻留在物理内存中。
4.建议后续的内存使用模式: madvise()
让一个进程能够对其虚拟内存区域的使用模式报告给内核。
madvise() 系统调用通过通知内核调用进程起始地址 addr,长度为 length 字节的范围之内的分页的可能的使用情况来提升应用程序的性能。内核可能
会使用这种信息来提升在分页之下的文件映射上之下的IO效率。