Linux下近无限增长匿名mmap实现报错问题求解
问题原因
你fd==-1分支的mmap调用参数缺失了必填标记:Linux 下使用MAP_ANONYMOUS时必须同时指定MAP_PRIVATE或者MAP_SHARED,你当前只传了MAP_ANONYMOUS|MAP_FIXED,不符合内核要求,因此调用失败返回(void*)-1。
修改方案
把else分支的mmap参数补加MAP_PRIVATE即可,测试阶段不需要持久化、不需要共享映射,用私有匿名映射完全符合需求:
else { // stp is 1 or 2 and PAGE is 4k ... filemap = mmap(reserve, PAGE*stp, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_FIXED|MAP_PRIVATE, -1, 0); }
这里主动把
fd参数硬写为-1更严谨,避免上层传错非-1的值到这个分支。
适配需求的补充说明
- 你最开始预留的1TB
PROT_NONE匿名映射仅占用虚拟地址空间,不会分配物理内存,完全符合你不浪费物理内存、不和其他内存区域冲突的要求 - 后续不管是绑定文件扩容还是测试阶段的匿名扩容,都可以直接在这个预留的地址区间内,用
MAP_FIXED覆盖映射对应区间即可,只有真正访问映射后的地址时才会分配物理页/加载文件内容,不需要提前清零整个1TB空间 - 多个miniheap可以各自分配在这个1TB空间的不同偏移位置,天然满足你分散在虚拟内存空间的要求
内容的提问来源于stack exchange,提问作者Adrian May
相关产品推荐
相关产品推荐

