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

我很困惑, mmap分配整个页面的内存(不pipe大小指定),还是只是分配你请求的大小? 真的,我很好奇后续调用mmap会发生什么 – 第二次调用会分配一个新页面(即使这两个调用都使用页面大小下的数量),还是会分配一个与前一个调用相邻的块?

mprotect – 保护整个页面,还是只mprotect指定的部分?

如果长度参数不是页面大小的倍数,则会将其四舍五入为页面大小倍数。

因此,你的问题的答案是肯定的mmap()虚拟分配只有整个页面。

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

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

是。

但是这不是因为mmap 本身 ,这是因为内核不能做任何不同的事情。 内存是按页面组织的,而MMU以页面的形式“思考”,所以没有办法(反正没有理智的方式)分配半页,把另一半分给其他人。
如何防止进程2窃取来自进程1的机密数据,如果他们每个都分配了半页? 内存保护系统不能这样工作,不可能防止这种情况发生。

mmap要求这个长度不为零,否则会失败。 除此之外,它对输入参数没有任何要求(除了相互矛盾的标志外),但是当然由于其他原因,执行总是被允许出现其他原因,根据自己的判断(这里的“执行”是指例如“Linux” )。

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

来源: POSIX