mmap是否分配页面或页面的一部分?

时间:2014-03-18 16:28:00

标签: c++ c linux mmap mprotect

我很困惑,mmap是否会分配整页内存(无论指定的大小),还是只分配您要求的大小?真的,我很好奇后续调用mmap会发生什么 - 第二次调用会分配一个新页面(即使两个调用都使用页面大小下的数量),还是会分配一个块相邻前一次电话会议?

mprotect的相同之处 - 是保护整个页面还是仅保护指定的部分?

2 个答案:

答案 0 :(得分:7)

但这不是因为mmap 本身,而是因为内核无法真正做出任何不同的事情。内存以页面形式组织,MMU以页面的形式“思考”,因此无法分配半页并将另一半分配给其他人。(无论如何,没有理智,合理的方式)。 如何一个,例如如果进程2分配了半页,则阻止进程2窃取进程1中的机密数据?记忆保护系统不能以这种方式工作,不可能防止这种情况发生。

mmap要求长度不为零,否则会失败。除此之外,它对输入参数没有要求(除了矛盾的标志),但当然一个实现总是允许由于其他原因而使得呼叫失败,由其自行决定(“实施”)这里的意思是“Linux”)。

映射的有效地址(将通过成功调用mmap返回)是地址提示的实现定义函数。实际上,这意味着将提示向下舍入到上一页(通常为4096字节)边界并将长度向上舍入到下一页边界。
不同版本的Linux在某些地址范围内表现不同,例如在版本2.6之前,mmap_min_addr以下的提示会因EINVAL而失败,而现在它会使地址向上舍入以使其有效。

来源:POSIX

答案 1 :(得分:5)

如果长度参数不是页面大小倍数,则会向上舍入到页面大小倍数。

因此,您的问题的答案是肯定的mmap()实际上只分配了整个页面。

关于mprotect(),手册页明确回答了您的问题:

  

mprotect()更改了对调用进程的内存页面的保护   包含区间[addr,地址范围的任何部分]   地址+ LEN-1]。 addr必须与页面边界对齐。