我的Mac上的mmap
手册页说明了以下内容
mmap()系统调用导致从addr开始并继续最多len个字节的页面从fd描述的对象映射,从字节偏移量偏移开始。
这是否意味着调用可以在没有错误的情况下失败并返回映射到小于所要求的地址范围的内存部分?
例如,如果我执行以下操作
void* memory = mmap(nullptr, range, PROT_READ | PROT_WRITE, MAP_ANONYMOUS, -1, 0);
那么调用是否可以成功而没有错误并返回一个不是range
字节长的地址范围?
答案 0 :(得分:1)
“地址范围”仍然是range
字节长(如果没有正确对齐,可能会更长),但可能无法映射。 len + offset
可能会延伸到映射对象的末尾(例如,超过文件末尾)。如果发生这种情况,那么文档会指出“超出映射对象末尾的任何扩展都将为零填充。”
答案 1 :(得分:1)
您面临的问题是提供许多不同相关事物的系统服务。
(假设“offset = 0”)如果您正在映射65字节的文件并指定“range = 50000”(假设页面大小小于50000),则映射区域将小于范围因为文件大小小于范围。
因此,虽然通常没有记录,但您可能会获得一个虚拟内存分配“范围”向下舍入到文件大小然后向上舍入到页面大小当您映射到文件时(您没有这样做)在你的例子中。)
在您没有映射到文件的情况下,分配可能会向上舍入到最近的页面。
同样,我假设你正在使用寻呼系统。