免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2385 | 回复: 4
打印 上一主题 下一主题

[内存管理] 查找一个空闲的地址区间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-16 13:20 |只看该作者 |倒序浏览
本帖最后由 stuman 于 2013-09-16 18:41 编辑

函数arch_get_unmapped_area()用于查找一个空闲的地址区间,其中有如下代码:
vma = find_vma(current->mm, addr);//参数addr表示从哪个地址开始查找
if (!vma || addr + len <= vma->vm_start)
return addr;

对于函数find_vma,是不是查找包含地址addr的已使用的地址区间呢?如果此函数返回值vma为null,是不是就表示没有包含地址addr的并被使用的区间(vma->vm_end > addr && vma->vm_start <= addr),此时就返回addr?

我的主要问题是为什么!vma为真时就返回addr?

还有在find_vma中,addr是大于vm_start的,那么测试条件addr + len <= vma->vm_start怎么可能为真呢?

论坛徽章:
0
2 [报告]
发表于 2013-09-16 20:45 |只看该作者
http://blog.chinaunix.net/uid-24774106-id-349079.html

"还有在find_vma中,addr是大于vm_start的,那么测试条件addr + len <= vma->vm_start怎么可能为真呢?"
这个要看系统的堆,mmap区域的增长方式,是向低地址方向增长还是向高地址方向增长。

论坛徽章:
0
3 [报告]
发表于 2013-09-16 21:16 |只看该作者
回复 2# zhuwentao0612

http://blog.chinaunix.net/uid-24774106-id-349079.html
这个博客我看了,里面的解释如下:

什么情况下是表示找到了我要的空间呢:
1 !vma   表示现存的空间,没有结束位置没有在addr之前的,表示addr到了一片边缘地带,我最偏远,
  OK ,这个无人耕种的地就为我用了,返回addr
2  addr + len <= vma->vm_start
这个条件的意思是,不但 vm_end在我上面,vm_start也在我上面,OK,我从addr开始伸腿,腿长len,
不会骚扰到vma,因为我们没有交集。 这种情况也很好,表示我找到一个空间来伸腿。即addr 。

我对第一点不理解,里面有句话“没有结束位置没有在addr之前的”,这句话看不懂呀,怎么有两个“没有”?是不是打字大错了?


   

论坛徽章:
0
4 [报告]
发表于 2013-09-17 13:05 |只看该作者
我现在的想法是,如果!vma为真,是不是说明已有的线性区中都不包括addr这个地址范围,那么这样就说明addr可用,于是就返回addr呢?

论坛徽章:
0
5 [报告]
发表于 2013-09-17 13:57 |只看该作者
本帖最后由 stuman 于 2013-09-17 18:23 编辑

"还有在find_vma中,addr是大于vm_start的,那么测试条件addr + len <= vma->vm_start怎么可能为真呢?"
这个问题没有解决,因为书上说此处地址是向高地址增长的

找了一段英文解释,但是看不懂

The answer is made clear if you look at the remark in the source of find_vma:

/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */

So, find_vma() might return a vma that doesn't actually map the address, hence the check.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP