我很困惑,mmap
是否会分配整页内存(无论指定的大小),还是只分配您要求的大小?真的,我很好奇后续调用mmap
会发生什么 - 第二次调用会分配一个新页面(即使两个调用都使用页面大小下的数量),还是会分配一个块相邻前一次电话会议?
mprotect
的相同之处 - 是保护整个页面还是仅保护指定的部分?
答案 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必须与页面边界对齐。