免费注册 查看新帖 |

Chinaunix

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

[内存管理] 进程所有vma的vm_end地址都是页对齐的吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-18 22:24 |只看该作者 |倒序浏览
向各位请教一个进程地址空间的问题,我正在看do_mmap_pgoff函数的源码,发现看到如下代码:
  1.        addr = get_unmapped_area(file, addr, len, pgoff, flags);
  2.        if (addr & ~PAGE_MASK)
  3.                 return addr;
复制代码
这边addr & ~PAGE_MASK相当于是把高位清零,也就是说,如果get_unmapped_area函数返回的地址,低12位不是全0的话,就表示出错了。而get_unmapped_area函数在搜索一个足够大的空洞时,无非就是把进程的所有vma遍历一遍(较新的内核版本中已经变成在红黑树中找了,不过没有本质区别),所以addr在返回的时候是有可能等于某个vma的vm_end的。这我就很奇怪,难道有规定,vma的end地址必须是页对齐的么?不然的话这段代码为什么能正确工作?

不知道我有没有描述清楚问题,希望大家指点,谢谢!

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
2 [报告]
发表于 2013-04-19 10:04 |只看该作者
回复 1# dycforever


add和size不是都进行了PAGE_ALIGH()处理了吗,这样得到的vm_end就应该是PAGE_ALIGN的啦。

   

论坛徽章:
0
3 [报告]
发表于 2013-04-19 13:45 |只看该作者
回复 2# embeddedlwp


    嗯,do_mmap_pgoff中的len参数是经过页对齐,不过我不知道是不是所有新建vma结构的地方都遵守这个规则,以前也没有在资料上看到过说vma->vm_end一定得是页对齐的,所以有点奇怪,就来问问哈

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2013-04-19 21:00 |只看该作者
难道还能不对齐?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
5 [报告]
发表于 2013-04-19 21:00 |只看该作者
想想就知道,不对齐的话,剩下的地址怎么管理?页是基本单位

论坛徽章:
0
6 [报告]
发表于 2013-04-19 21:35 |只看该作者
回复 5# amarant
有可能不对齐的吧,比如栈的动态扩展?
do_page_fault->__do_page_fault->expand_stack->expand_downwards
  1. if (address < vma->vm_start) {
  2.                 unsigned long size, grow;

  3.                 size = vma->vm_end - address;
  4.                 grow = (vma->vm_start - address) >> PAGE_SHIFT;

  5.                 error = acct_stack_growth(vma, size, grow);
  6.                 if (!error) {
  7.                         vma->vm_start = address; //这儿是访问栈时的缺页异常地址
  8.                         vma->vm_pgoff -= grow;
  9.                 }
  10.         }
复制代码

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
7 [报告]
发表于 2013-04-20 19:16 |只看该作者
回复 6# junnyg


    你好,多谢指出。但我看了下相关代码:
  1. int expand_downwards(struct vm_area_struct *vma,
  2.                                    unsigned long address)
  3. {
  4.         int error;

  5.         /*
  6.          * We must make sure the anon_vma is allocated
  7.          * so that the anon_vma locking is not a noop.
  8.          */
  9.         if (unlikely(anon_vma_prepare(vma)))
  10.                 return -ENOMEM;

  11.         address &= PAGE_MASK;
  12.         error = security_mmap_addr(address);
  13.         if (error)
  14.                 return error;

  15.         vma_lock_anon_vma(vma);
  16. ........
复制代码
address 在前面已经对齐了

论坛徽章:
0
8 [报告]
发表于 2013-04-20 19:28 |只看该作者
回复 7# amarant
是的。。。是我粗心了~


   

论坛徽章:
0
9 [报告]
发表于 2013-04-23 10:34 |只看该作者
看看学学!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP