但这不是因为mmap 本身,而是因为内核不能真正做出任何不同的事情.内存以页面形式组织,MMU以页面的形式"思考",因此无法分配半页并将另一半分配给其他人,这是无法理解的.
如果一个人分配半页,那么如何阻止进程2从进程1中窃取机密数据?内存保护系统不能以这种方式工作,不可能防止这种情况发生.
mmap要求长度不为零,否则会失败.除此之外,它对输入参数没有要求(除了矛盾的标志之外),但当然总是允许实现由于其他原因使呼叫失败,由其自行决定(这里的"实现"意味着例如"Linux") ).
映射的有效地址(将通过成功调用返回mmap)是地址提示的实现定义函数.实际上,这意味着舍入提示向下到前一页(通常4096字节)边界和舍入长度可达到下一个页边界.
不同版本的Linux在某些地址范围内表现不同,例如在版本2.6之前,下面的提示mmap_min_addr会失败,EINVAL而现在它会将地址向上舍入以使其有效.
资料来源:POSIX
如果length参数不是页面大小倍数,则它将向上舍入到页面大小倍数.
因此,您的问题的答案是肯定的,mmap()实际上只分配整个页面.
关于mprotect()手册页,请清楚地回答您的问题:
mprotect()更改调用进程的内存页面的保护,该内存页面包含区间[addr,addr + len-1]中地址范围的任何部分.addr必须与页面边界对齐.
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |