c++ - mmap分配的是页面还是页面的一部分?

标签 c++ c linux mmap mprotect

我很困惑,mmap 是分配整页内存(不管指定的大小),还是只分配您请求的大小?真的,我很好奇后续调用 mmap 会发生什么——第二次调用会分配一个新页面(即使两个调用都使用低于页面大小的数量)还是会分配一个 block 与上一个电话相邻?

对于 mprotect 也是如此 - 它是保护整个页面,还是只保护指定的部分?

最佳答案

是的。

但这并不是因为 mmap 本身,而是因为内核真的不能做任何不同的事情。内存以页为单位进行组织,而 MMU 以页为单位进行“思考”,因此无法(无论如何都没有理智、合理的方式)分配半页并将另一半给其他人。
一个人会怎样?防止进程 2 从进程 1 窃取 secret 数据,如果他们各自分配了半页?内存保护系统不是那样工作的,不可能阻止这种情况的发生。

mmap 要求长度不为零,否则会失败。除此之外,它对输入参数没有任何要求(除了相互矛盾的标志),但当然总是允许实现调用因其他原因而失败,由其自行决定(“实现”这里的意思是例如“Linux”)。

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

来源:POSIX

关于c++ - mmap分配的是页面还是页面的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485351/

相关文章:

c++ - 我可以在 Armadillo 中实例化矩阵,然后在后面的代码行中将其设置为使用辅助内存吗?

c++ - 在 CUDA 中从主机访问设备上的类成员数组指针

c++ - 如何在 C++ 中检测字符串输入的文件结尾

java - 用C写Java这段?

c - 如何使用 GPLINK 在地址 04 处编译一个函数? (对于 PIC16)

c - opendir:打开的文件太多

c++ - 如何拥有类似于 unsigned char 的类型,但不允许别名?

c - 使用指针而不是索引进行排序

json - 如何根据其他值筛选使用 jq 选择的对象?

linux - arm-linux-gnueabi-ld 无法识别的选项 '-Wl,--gc-sections'