当前课程知识点:Linux 内核分析与应用 > 第4章 内存管理 > 4.1 Linux内存管理机制 > Video
大家好今天我们来介绍下Liunux的内存管理机制
那么大家所熟知的是内存(RAM)和外存
尽管内存比外存速度快很多
但还是无法与CPU的速度匹配
因此CPU内部就需要更快的存储装置
这就是高速缓存(Cache)
我们可以通过lscpu命令呢
查看内存的层次结构
那么通过这个命令我们看列出了各级缓存
从这个输出结果看出呢
在x86机器上呢
L1d 和L1i cache呢
作为一级数据和指令Cache
那么L2,L3缓存为
二级和三级Cache
它们的大小呢各不同
访问速度也各有差异
那么Linux如何对虚拟内存进行管理
我们总结出五种机制
它们分别是 地址映射机制 内存分配机制
缓存和刷新机制
请页机制以及交换机制
这里我们给出这五种机制之间的关系图
这个图如何体现这几种机制之间的相互配合和使用
首先我们看内核通过映射机制呢
把进程从磁盘映射到虚拟地址空间
那么当进程执行的时候呢
如果发现要访问的页没有在物理内存的时候呢
它就发出了页请求 如图中的1
如果有空闲的内存可供分配的话
就请求分配内存 如图中的2
这时就用到了内存的分配和回收机制
而且把正在使用的页记录在页缓存中如图3
这个时候就用到了缓存机制
如果没有足够的内存可供分配的时候呢
这时就要调用交换机制
腾出一部分内存 如图中的4和5
另外在地址映射中要通过TLB
来加速物理内存的寻找如图中的8
那么交换机制中也要用到交换缓存如图中的6
并且呢把物理页呢
内容交换到交换文件中后呢
也要通过修改页表来映射文件的地址如图中的7
我们说程序一旦被执行就成为一个进程
那么内核呢就会为每个运行的进程呢
提供了大小相同的虚拟地址空间
这使得多个进程可以同时运行而又不会互相干扰
具体来说一个进程对某个地址的访问
绝不会干扰其他进程对同一地址的访问
如图是x86 的32位地址空间示意图
从这个图我们可以看到呢
每个进程通过系统调用进入内核
那么内核空间由系统内的所有进程共享的
从进程的角度来看每个进程呢实际上拥有了
4GB的虚拟地址空间 我们把它也叫做虚拟内存
每个进程有各自的私有用户空间(0-3GB)
那么这个空间对系统中的其他进程是不可见的
最高的1GB内核空间呢
则是为所有进程以及内核所共享
进程地址空间是如何布局的呢
这张图我们给出了一般的
进程地址空间的布局
我们说呢每个进程呢
编译链接后形成的二进制映像文件呢
都有一个代码段(Text)和数据段 也就是BSS和Data
那么进程运行时呢
必须有独占的堆(Heap)和栈(Stack)空间
链接器和函数库都有自己的
代码段(Text)和数据段(BSS和Data)
那么进程要映射的文件呢
就被映射到内存映射区 也就是MMR区(Memory Mapping Region)
那么如何用数据结构描述进程的用户空间
Linux把进程的用户空间呢
划分为一个个的区间
为什么要划分区间呢 实际上是为了便于管理
那么这些区间称为虚拟内存区
简称为vma
那么一个进程的用户地址空间呢
就由两个数据结构来描述
一个叫做mm_struct结构
另外一个叫做vm_area_struct结构
那么mm_struct结构描述什么呢
它是对进程整个用户空间进行描述
那么vm_area_struct结构呢
就是对用户空间的各个内存区进行描述
那么我们下面来看一下mm_struct
这个结构在源代码中的部分字段
这个时候我们去打开源代码
那么这个结构在内核不同的版本里头呢 它所处的文件可能不一样
在比较新的版本中它定义在mm_types.h这个文件中
那么打开这个文件找到mm_struct结构
那么在这个结构体中有很多很多的字段
我们怎么样去理解这些字段呢
下面我们给出了mm_struct结构的
基本字段以及它对应的含义
那么在这里我们对每个字段呢
不进行一一的讲解了 大家可以去查看每个字段的含义
那么在这里只提及几个重要的字段
一个进程的虚拟空间中呢
可能有多个虚拟区间
那么对这些虚拟区间的组织方式有两种
当虚拟区较少时采用单链表就可以了
由mmap指针指向这个链表
那么当虚拟区间比较多的时候呢
就采用红黑树这种结构来进行管理
由mm_rb指向
而指针pgd指向呢
该进程的页目录
当调度程序调度一个程序运行的时候呢
就将这个虚地址呢
转成物理地址 并写入控制寄存器CR3中
那么其他字段呢就不一一介绍了大家可以自己来看
那么mm_struct如何描述地址空间
那么在这里我们给出了一张图
在进程的task_struct结构中呢有一个字段叫做mm
它实际是指向mm_struct结构
而mm_struct结构中各个区域的起始和结束字段呢
描述了进程地址空间的各个虚存区(VMA)
那么在这里我们给出了呢
各个主要的虚存区
下面我们来简单介绍一下虚存区的结构
也就是VM_AREA_STRUCT结构
那么这个呢结构描述进程用户空间的
一个虚拟内存区间(Virtual Memory Area,简称VMA)
它的定义如下
虚存区(VMA)主要字段的含义我们通过表格列出来
在这个表里面我们看到 第一个字段呢
它就指向虚存区所在的mm_struct结构的指针
然后呢第二个和第三个分别指向虚存区的起始地址和终止地址的指针
然后还有一个字段表示虚存区的保护权限
在这里我们对每一个字段不进行一一的介绍
那么这里我们主要来说明呢
为什么把进程的用户空间要划分为一个一个的区间呢
这是因为每个虚存区可能来源不同
有的可能来源于可执行文件的映像
有的可能来自共享库
而有的则可能是动态分配的内存区
那么对不同的区间可能有不同的访问权限
也有可能有不同的操作
因此Linux 把进程的用户空间呢
就来分割地管理了
并利用了虚存区处理结构
·vm_ops
那么这个结构呢
来抽象出对不同来源虚存区的处理方法了
它的定义如下
在这个里头呢
我们给出了几个主要的函数
其中第一个是打开函数 第二个是关闭函数
第三个指向nopage
就是指向缺页处理函数
也是我们整个虚存管理中非常重要的一个函数
那么VMA如何映射到地址空间呢
这里给出了一张图
从这个图可以看出呢
mm_struct结构是由一个个的VMA组成
那么进程的代码段和数据段呢
就映射到呢Text段和Data段
而共享库呢也就是.so呢
映射到内存的映射区域
下面我们给出这几种数据结构的之间的关系图
从这个关系图我们可以看出呢
进程控制块是内核中的核心数据结构
在进程的 task_struct 结构中包含一个mm域
它是指向 mm_struct 结构的指针
而进程的 mm_struct结构中呢
包含进程的可执行映像信息
以及进程的页目录指针
那么该结构还包含有指向 虚存区(vm_area_struct )结构的几个指针
每个 VMA代表进程的一个虚拟地址区间
通过这个图我们可以把
进程和内存关联起来
那么关于内存管理的基本知识我们就介绍到这里
下面呢我们给出参考资料
那么这个参考资料依然是《深入理解Linux内核》(第三版)
第八和九章的内容
同时要让大家带着思考离开
那么我们刚才给大家介绍了进程的地址空间描述的两个数据结构
那么这两个数据结构mm_struct呢
和vm_area_strcut结构呢
到底是什么时候被映射的呢
大家可以来思考一下
我们可以在下一讲中呢会涉及到
谢谢大家
-1.1 Linux操作系统概述
-1.2 Linux内核结构以及内核模块编程
--Video
-1.3 Linux内核源码中的双链表结构
--Video
-1.4 源码分析-内核中的哈希表
--Video
-1.5 动手实践-Linux内核模块的插入和删除
--Video
-第1章 概述--章节测验
-2.1 内存管理之内存寻址
--Video
-2.2 段机制
--Video
-2.3分页机制
--Video
-2.4 动手实践-把虚拟地址转换成物理地址
--Video
-第2章 内存寻址--章节测验
-3.1 进程概述
--Video
-3.2 Linux进程创建
--Video
-3.3 Linux进程调度
--Video
-3.4 动手实践-打印进程描述符task_struct中的字段
--Video
-3.5工程实践-基于内核模块的负载监控
--Video
-第3章 进程管理--章节测验
-4.1 Linux内存管理机制
--Video
-4.2 进程用户空间管理机制
--Video
-4.3 物理内存分配与回收机制(上)
--Video
-4.4 物理内存分配与回收机制(下)
--Video
-4.5 动手实践-Linux内存映射基础(上)
--Video
-4.6 动手实践-Linux内存映射实现(中)
--Video
-4.7 动手实践-Linux内存映射测试(下)
--Video
-4.8 初学者对内存管理的常见疑惑
-第4章 内存管理--章节测验
-5.1 中断机制概述
--Video
-5.2 中断处理机制
--Video
-5.3 中断下半部处理机制
--Video
-5.4 时钟中断机制
--Video
-5.5 动手实践-中断上半部的代码分析及应用
--Video
-5.6 动手实践-中断下半部的代码分析及应用
--Video
-第5章 中断--章节测验
-6.1 Linux中的各种API
--Video
-6.2 系统调用机制
--Video
-6.3 动手实践-添加系统调用(系统调用日志收集系统)
--Video
-第6章 系统调用--章节测验
-7.1 内核同步概述
--Video
-7.2 内核同步机制
--Video
-7.3 动手实践-内核多任务并发实例(上)
--Video
-7.4 动手实践-内核多任务并发实例(下)
--Video
-第7章 内核同步--章节测验
-8.1 虚拟文件系统的引入
--Video
-8.2 虚拟文件系统的主要数据结构
--Video
-8.3 文件系统中的各种缓存
--Video
-8.4 页高速缓存机制以及读写
--Video
-8.5 动手实践-编写一个文件系统(上)
--Video
-8.6 动手实践-编写一个文件系统(中)
--Video
-8.7 动手实践-编写一个文件系统(下)
--Video
-第8章 文件系统--章节测验
-9.1 设备驱动概述
--Video
-9.2 I/O空间管理
--Video
-9.3 设备驱动模型
--Video
-9.4 字符设备驱动程序简介
--Video
-9.5 块设备驱动程序简介
--Video
-9.6 动手实践-编写字符设备驱动程序
--Video
-9.7工程实践-编写块设备驱动的基础(上)
--Video
-9.8 工程实践-块设备驱动程序分析(中)
--Video
-9.9 工程实践-块设备驱动程序实现(下)
--Video
-第9章 设备驱动--章节测验
-致谢与说明
--Video