linux内存管理之用户态内存管理
来源:互联网 发布:javascript 获取位置 编辑:程序博客网 时间:2024/06/18 13:48
分配一个新的线性区
do_mmap =>ret = do_mmap_pgoff(file, addr, len, prot, flag, offset >> PAGE_SHIFT); =>len = PAGE_ALIGN(len); =>addr = get_unmapped_area(file, addr, len, pgoff, flags);//找到一个空闲的线性区 =>get_area = current->mm->get_unmapped_area; =>addr = get_area(file, addr, len, pgoff, flags);//mm->get_unmapped_area = arch_get_unmapped_area; =>addr = PAGE_ALIGN(addr); =>vma = find_vma(mm, addr); =>注意,vma && vma->vm_end > addr 的优先级是 > 更高,可以理解成 (vma && (vma->vm_end > addr)) =>通过红黑树查找 full_search: for (vma = find_vma(mm, addr); ; vma = vma->vm_next) =>error = security_file_mmap(file, reqprot, prot, flags, addr, 0); =>security_ops->file_mmap (file, reqprot, prot, flags, addr, addr_only); =>mmap_region(file, addr, len, flags, vm_flags, pgoff, accountable); =>vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent); =>vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); vma->vm_mm = mm; vma->vm_start = addr; vma->vm_end = addr + len; vma->vm_flags = vm_flags; vma->vm_page_prot = protection_map[vm_flags & (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; vma->vm_pgoff = pgoff; addr = vma->vm_start; pgoff = vma->vm_pgoff; vm_flags = vma->vm_flags; =>make_pages_present(addr, addr + len); =>vma = find_vma(current->mm, addr); =>ret = get_user_pages(current, current->mm, addr, len, write, 0, NULL, NULL);
分配了线性区之后只是空头支票,没有干货,当访问内存的时候的时候要走入缺页中断
另外一个与分配线性区类似的是malloc,调用do_brk
do_brk =>if (security_vm_enough_memory(len >> PAGE_SHIFT)) //len >> PAGE_SHIFT 把len转换成pages作为参数, =>security_ops->vm_enough_memory(current->mm, pages); =>selinux_vm_enough_memory =>__vm_enough_memory//判断物理内存是否够用,是否能申请下len大小的空间,这个函数貌似很有用,后续好好研究一下 =>vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); =>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 & (VM_READ|VM_WRITE|VM_EXEC|VM_SHARED)]; =>vma_link(mm, vma, prev, rb_link, rb_parent); =>make_pages_present(addr, addr + len);
参考文章
linux底层内存管理–用户空间的分级分配系统以及懒惰的含义
http://blog.csdn.net/liuyuanqing2010/article/details/6680443
linux内存管理之sys_brk实现分析 和 Linux内核分析之缺页中断
http://blog.csdn.net/sadamoo/article/category/1334891
阅读全文
0 0
- linux内存管理之用户态内存管理
- linux内存管理 之 物理内存管理
- 内存管理之用户空间
- linux 内存管理之kmalloc
- linux内存管理 之 DMA
- Linux内存管理之初始化
- linux内存管理之malloc
- linux内存管理之mmap
- linux内存管理之malloc
- linux内存管理之kmalloc
- linux内存管理之kmem_cache_init
- linux内存管理之vmalloc
- linux内存管理之malloc
- linux内存管理之DMA
- linux内存管理之数据结构
- linux内存管理之DMA
- linux内存管理之zone
- linux内存管理之vmalloc
- 指针
- Noip提高组 2004 T4 虫食算 搜索优化
- C++不可继承类final
- [翻译]机器学习如何个性化推荐音乐
- dfdsfa
- linux内存管理之用户态内存管理
- 写一个函数返回参数二进制中1的个数(三种方法)
- 【BZOJ3990】【SDOI2015】排序
- Note8对比iPhone X,锐意进取的三星何以成为榜样?
- 2017.10.13. 读入、输出优化
- Android的Fragment BackStack回退功能
- UTF-8HTML部署到tomcat乱码
- 060 不定积分之第二类换元积分法
- openjudge noi 2987 小兔子捡金币(模拟)