博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于do_brk()分析
阅读量:6943 次
发布时间:2019-06-27

本文共 1514 字,大约阅读时间需要 5 分钟。

do_brk()源码剖析

unsigned long do_brk(unsigned long addr, unsigned long len){...}
do_brk函数目的是为了将addr位置向后继续申请len字节长度,用作于扩展堆内存的长度
  1. 首先会对于len这个长度进行页面对齐,并且去判断页面对齐之后是否超出了边界

    len = PAGE_ALIGN(len);   if (!len)       return addr;   if ((addr + len) > TASK_SIZE || (addr + len) < addr)       return -EINVAL;
  2. 判断一下当前的物理内存是否处于锁定状态(防止被交换出去),保持和原来状态的一致性

    if (mm->def_flags & VM_LOCKED) {       unsigned long locked, lock_limit;       locked = mm->locked_vm << PAGE_SHIFT;       lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;       locked += len;       if (locked > lock_limit && !capable(CAP_IPC_LOCK))           return -EAGAIN;   }
  3. 寻找当前addr位置对应的vma,看看是不是已经存在的vma将addr已经覆盖了,需要调用munmap将覆盖部分清除,保证addr到addr+len这一段内存是空白的没有被任何的vma所覆盖。

    vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);   if (vma && vma->vm_start < addr + len) {       if (do_munmap(mm, addr, len))           return -ENOMEM;       goto munmap_back;   }
  4. 对于当前上一个的vma进行扩展,扩展至addr加上len的位置,如果成功那么OK,进行mm_struct的维护然后返回。

    if (vma_merge(mm, prev, addr, addr + len, flags,               NULL, NULL, pgoff, NULL))   goto out;
  5. 否则需要来创建一个新的vma来对当前的内存进行映射,将变量设置后放入vma的红黑树链表中。

    vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);   if (!vma) {       vm_unacct_memory(len >> PAGE_SHIFT);       return -ENOMEM;   }   memset(vma, 0, sizeof(*vma));   vma->vm_mm = mm;   vma->vm_start = addr;   vma->vm_end = addr + len;   vma->vm_pgoff = pgoff;   vma->vm_flags = flags;   vma->vm_page_prot = protection_map[flags & 0x0f];   vma_link(mm, vma, prev, rb_link, rb_parent);

转载地址:http://oeanl.baihongyu.com/

你可能感兴趣的文章
加密货币 (Cryptocurrency) 市值 (market capitalization) 列表
查看>>
julia应用于自动驾驶汽车、机器人、3D 打印、精准医疗、增强现实、基因组学、能源交易、机器学习、金融风控和太空任务设计等多个领域...
查看>>
Go Web:数据存储(3)——gob对象序列化
查看>>
协同过滤的几点思考
查看>>
multiple levlve proxy route deploy
查看>>
父窗体刷新子窗体
查看>>
MSSQL 数据页查询使他 DBCC PAGE 详细说明
查看>>
(转)数据库范式那些事
查看>>
DES加密GUID+文件名称,关于DES加密后文件长度是否超过WINDOWS文件命名规定长度255个字节。...
查看>>
10款HTML5编码简化工具
查看>>
SQLite在多线程环境下的应用
查看>>
JQuery 原理
查看>>
POJ---1860 Currency Exchange[套汇问题SPFA()正权回路的判定]
查看>>
(转)2个高效存储过程分页及对比
查看>>
as3翻牌动画
查看>>
VirtualTreeview 参考
查看>>
lsof,ulimit,
查看>>
Windows几种线程同步方法介绍
查看>>
有效提高命中率的缓存设计
查看>>
Xamarin 获融资1200万美元
查看>>