• Linux内存:内存管理的天禀




    作者: Austria 出自: http://www.linuxdiyf.com
    1. 内核初始化:

    内核创建好内核页目次页表数据库,假定物理内存大小为len,则创建了[3G--3G len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应干系;

    内核创建一个page数组,page数组和物理页面系列完尽是线性对应,page用来管理该物理页面形状,每个物理页面的虚地址生存在page->virtual中;

    内核创建好一个free_list,将没有运用的物理页面对应的page放入此中,曾经运用的就不消放入了;

    2. 内核模块恳求内存vaddr = get_free_pages(mask,order):

    内存管理模块从free_list找到一个page,将page->virtual作为前往值,该前往值就是对应物理页面的虚地址;

    将page从free_list中脱离;

    模块运用该编造地址操纵对应的物理内存;

    3. 内核模块运用vaddr,比方实行指令mov(eax, vaddr):

    CPU获得vaddr这个虚地址,利用创建好的页目次页表数据库,找到其对应的物理内存地址;

    将eax的内容写入vaddr对应的物理内存地址内;

    4. 内核模块释放内存free_pages(vaddr,order):

    依据vaddr找到对应的page;将该page插足到free_list中;

    5. 用户进程恳求内存vaddr = malloc(size):

    内存管理模块从用户进程内存空间(0--3G)中找到一块还没运用的空间vm_area_struct(start--end);

    随后将其拔出到task->mm->mmap链表中;

    6. 用户进程写入vaddr(0-3G),比方实行指令mov(eax, vaddr):

    CPU获得vaddr这个虚地址,该虚地址应该已颠末glibc库设置好了,肯定在3G一下的某个区域,凭据CR3存放器指向的current->pgd查此后进程的页目次页表数据库,发现该vaddr对应的页目次表项为0,故孕育产生发火出格很是;

    在出格很是措置中,发现该vaddr对应的vm_area_struct曾经存在,为vaddr对应的页目次表项分配一个页表;

    随后从free_list找到一个page,将该page对应的物理页面物理首地址赋给vaddr对应的页表表项,很邃晓,此时的vaddr和paddr不是线性对应干系了;

    将page从free_list中脱离;

    出格很是措置前往;

    CPU从头实行刚才产生发火出格很是的指令mov(eax, vaddr);

    CPU获得vaddr这个虚地址,凭据CR3存放器指向的current->pgd,利用创建好的页目次页表数据库,找到其对应的物理内存地址;

    将eax的内容写入vaddr对应的物理内存地址内;

    7. 用户进程释放内存vaddr,free(vaddr):

    找到该vaddr所在的vm_area_struct;

    找到vm_area_struct:start--end对应的全数页目次页表项,清空对应的全数页表项;

    释放这些页表项指向物理页面所对应的page,并将这些page插足到free_list行列中;

    有需求还会清空一些页目次表项,并释放这些页目次表项指向的页表;

    从task->mm->mmap链中删除该vm_area_struct并释放掉;

    综合分析:

    可用物理内存就是free_list中各page对应的物理内存;

    页目次页表数据库的次要目的是为CPU会见物理内存时转换vaddr-->paddr运用,分配以及释放内存时不会用到,但是需求内核内存管理系统在适合机会为CPU创建好该库;

    唐塞用户进程在6中获得的物理页面,有两个页表项对应,一个就是内核页目次页表数据库的某个pte[i ],一个就是此后进程内核页目次页表数据库的某个 pte[j],但是只要一个page和其对应。倘若此时调节到其他进程,其他进程恳求并会见某个内存,则不会触及到该物理页面,因为其分配时起次要从 free_list中找一个page,而该物理页面对应的page曾经从free_list中脱离出来了,是以不存在该物理页面被其他进程改写操纵的环境。内核中颠末get_free_pages等体式格局获取内存时,也不会触及到该物理页面,原理同前所述。




    版权声明: 原创作品,批准转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。不然将追究法律责任。

  • 相关阅读:
    【腾讯Bugly干货分享】微信Tinker的一切都在这里,包括源码(一)
    【腾讯Bugly干货分享】iOS10 SiriKit QQ适配详解
    【腾讯Bugly干货分享】安卓单元测试:What, Why and How
    【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
    【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
    【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?
    【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
    从零开始安装Hadoop视频教程
    如何在MAC机器中实现移动设备WiFI上网(没有专门的无线路由器的情况)
    Alfresco安装与配置图解
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975952.html
Copyright © 2020-2023  润新知