免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2955 | 回复: 1

[C] mmap两次到同一vm地址,这样做是为什么? [复制链接]

论坛徽章:
0
发表于 2010-10-13 11:20 |显示全部楼层
第一次调用的代码

/*
         * Reserve needed memory area to avoid a race.
         * It should be discarded using:
         *  - mmap() with MAP_FIXED flag
         *  - mremap() with MREMAP_FIXED flag
         *  - shmat() with SHM_REMAP flag
         */
        ptr = mmap((void *)(unsigned long)addr, size, PROT_NONE,
                   MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0);

第二次

        p = mmap(g2h(mmap_start),
                 host_len, prot, flags | MAP_FIXED | MAP_ANONYMOUS, -1, 0);

参数不一样是因为在不同的函数里.

strace的显示:
mmap2(0x40000000, 528384, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x40000000
mmap2(0x40000000, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40000000
这两次之间没有进行munmap.


前面的注释看不懂,不理解这个为什么要这样做两次, discard何必呢?

论坛徽章:
0
发表于 2010-10-13 21:49 |显示全部楼层
本帖最后由 lemoncookie 于 2010-10-13 21:58 编辑

注释的意思是先要预留内存,防止到时候出现竞争而分配不到
预留的内存可以用接下来说的三种方法来使用
所谓discard应该是指放弃这个映射改用其他方法来使用这块内存

给出的代码中
  1. mmap2(0x40000000, 528384, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x40000000
  2. mmap2(0x40000000, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40000000
复制代码
注意到第一次调用时protection参数设置的PROT_NONE,实际上此时这块映射到的内存是不能访问的
这也就解释了前面注释的内容——现在仅仅是预留这块空间,后面再用
第二次用的时候protection参数就成了read write均可了
这时候预留的内存空间才真正可用了

至于为什么这么做
大概只能说是程序员不想在后面要用的时候(即第二次调用)出现所说的竞争(race)而mmap不成功
因而事先尝试预留一块
早点预留还可以保证指定的vm起始地址能够得到
如果不这么做,假如有人在第二次调用之前也用了mmap,addr的参数指定在0X40000000附近
那么这个地址就不能再用了,可能他想获得这段虚拟地址空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP