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

sir*_*lot 4 c c++ linux mmap mprotect

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

同样的事情mprotect- 是保护整个页面还是仅保护指定的部分?

Dam*_*mon 7

是.

但这不是因为mmap 本身,而是因为内核不能真正做出任何不同的事情.内存以页面形式组织,MMU以页面的形式"思考",因此无法分配半页并将另一半分配给其他人,这是无法理解的.
如果一个人分配半页,那么如何阻止进程2从进程1中窃取机密数据?内存保护系统不能以这种方式工作,不可能防止这种情况发生.

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

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

资料来源:POSIX


Man*_*lva 5

如果length参数不是页面大小倍数,则它将向上舍入到页面大小倍数.

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

关于mprotect()手册页,请清楚地回答您的问题:

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