最近在学习linux内存知识,发现一篇总结的很好的文章。文章原信息如下:

作者:frank_seng

Linux内存:内存管理的实质

http://bbs.chinaunix.net/thread-2055231-1-1.html

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等方式获取内存时,也不会涉及到该物理页面,原理同前所述。

个人学习笔记---Linux内存:内存管理的实质相关推荐

  1. git学习笔记——Linux和Windows下git的基本操作

    git学习笔记--Linux和Windows下git的基本操作 github主页:https://github.com/Taot-chen 一.Linux环境 1.安装git sudo apt-get ...

  2. 51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

    51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为 ...

  3. 『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性...

    『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性 __________________________________ ...

  4. 学习笔记:MOOC 文献管理与信息分析

    学习笔记:MOOC 文献管理与信息分析 文章目录 学习笔记:MOOC 文献管理与信息分析 前言 本科硕士博士的差异 科研的特性 读研的意义 学习策略 学习与搜索 两种类型的知识 什么是需求? 搜商 基 ...

  5. 多路径配置udev_学习笔记:Linux多路径配置 multipath实现设备用户组绑定详细设置...

    天萃荷净 Linux多路径软件配置,通过multipath实现设备用户组绑定详细设置 现在的Linux系统中,很多都会使用系统自带的multipath多路径软件,在以前的版本中,我们一般通过multi ...

  6. 【学习笔记】C++内存管理-侯捷

    文章目录 C++内存管理:从平地到万丈高楼 一.primitives-基础工具 1.内存分配的四个层面 2.new/delete表达式 2.1 new表达式 2.2 delete表达式 学习笔记源自博 ...

  7. C语言学习笔记之动态内存分配结构体——辣鸡版学生管理系统

    @[C语言学习笔记] 小辣鸡自学C语言中,好多视频教程都有这个案例,小辣鸡自己边学边记,下边是代码. 如有错误,感谢告知!!! #include<stdio.h> #include< ...

  8. MySQL学习笔记8:权限管理、数据库备份与设计

    1.前言 学习视频源自:[狂神说Java]MySQL最新教程通俗易懂 B站视频链接:https://www.bilibili.com/video/BV1NJ411J79W [狂神说Java]MySQL ...

  9. blfs(systemd版本)学习笔记-配置远程访问和管理lfs系统

    要实现远程管理和配置lfs系统需要配置以下软件包: 前几页章节脚本的配置:https://www.cnblogs.com/renren-study-notes/p/10390598.html wget ...

  10. Linux 高并发学习笔记 - Linux 文件操作函数

    1.6.2 Linux 文件操作函数 Linux 高并发学习笔记 - 笔记索引 前言 关于文件操作函数这一块主要用英文文档的形势书写,因为凉皮在写文档的时候发现Markdown用起来太繁琐了.那么关于 ...

最新文章

  1. IDEA统一设置编码为utf-8编码及tomcat 乱码问题的解决
  2. Python Excel操作模块XlsxWriter之插入图片worksheet.insert_image
  3. k8s中service类型
  4. Mule学习笔记(二)
  5. 点击按钮显示div并向div中传递参数
  6. flutter 动画json_Flutter 50: 图解动画小插曲之 Lottie 动画
  7. [css] OOCSS有哪些好处?对应的库有哪些?
  8. mysql kill 超过1分钟的语句
  9. 悬赏17万:美国“知乎”的沙雕问题,需要AI来识别
  10. 代理设置(wget/yum)
  11. VMware共享文件夹Input/output error解决办法
  12. 您需要计算机管理员权限,安装需要管理员权限,教您怎么设置安装软件需要管理员权限...
  13. comsol入门闲聊
  14. android 7.0 壁纸设置,android7.0怎么换锁屏壁纸
  15. 抠图应用程序设计(二)——磁性套索工具Livewire算法的实现
  16. 中望3D 2021 插入基准面 - 2实体构面法
  17. 南非数字货币应用潜力巨大 小试牛刀审慎探索
  18. 梦幻西游手游登录显示服务器错误,梦幻西游手游无法登陆怎么解决 无法登陆原因及解决方案一览_3DM手游...
  19. 台式计算机多少g的显卡怎么看,怎样看电脑配置|怎样看电脑显卡配置?
  20. 卸载asterisk

热门文章

  1. Ucinet三天写论文!自同构对等分析实战
  2. 时差怎么理解_懂的人自然懂,不懂的人再多解释也有时差
  3. 解决Linux服务器时差问题
  4. 老工程师10年c语言总结,一位老电子工程师十年感悟:环顾四周,也没见几个有出息的!...
  5. “熊猫烧香”制造者的起伏人生
  6. pyhton爬虫爬取100首诗
  7. 普渡大学科技学院计算机信息技术,普渡大学-学院介绍
  8. 全屏 虚拟机_虚拟机的导入
  9. c语言大一期中考试知识点,大一期末考试复习计划
  10. matlab upfc,UPFC是什么意思