当前课程知识点:Linux 内核分析与应用 >  第4章 内存管理 >  4.1 Linux内存管理机制 >  Video

返回《Linux 内核分析与应用》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《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结构呢

到底是什么时候被映射的呢

大家可以来思考一下

我们可以在下一讲中呢会涉及到

谢谢大家

Linux 内核分析与应用课程列表:

第1章 概述

-1.1 Linux操作系统概述

--1.1 Linux 操作系统概述

-1.2 Linux内核结构以及内核模块编程

--Video

-1.3 Linux内核源码中的双链表结构

--Video

-1.4 源码分析-内核中的哈希表

--Video

-1.5 动手实践-Linux内核模块的插入和删除

--Video

-第1章 概述--章节测验

-第1章导学--引领你进入Linux内核的大门

第2章 内存寻址

-2.1 内存管理之内存寻址

--Video

-2.2 段机制

--Video

-2.3分页机制

--Video

-2.4 动手实践-把虚拟地址转换成物理地址

--Video

-第2章 内存寻址--章节测验

-第二章导学-从零打造自己的操作系统

第3章 进程管理

-3.1 进程概述

--Video

-3.2 Linux进程创建

--Video

-3.3 Linux进程调度

--Video

-3.4 动手实践-打印进程描述符task_struct中的字段

--Video

-3.5工程实践-基于内核模块的负载监控

--Video

-第3章 进程管理--章节测验

-第三章导学-进程背后琳琅满目的宝贝到哪里挖?

第4章 内存管理

-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章 中断

-5.1 中断机制概述

--Video

-5.2 中断处理机制

--Video

-5.3 中断下半部处理机制

--Video

-5.4 时钟中断机制

--Video

-5.5 动手实践-中断上半部的代码分析及应用

--Video

-5.6 动手实践-中断下半部的代码分析及应用

--Video

-第5章 中断--章节测验

第6章 系统调用

-6.1 Linux中的各种API

--Video

-6.2 系统调用机制

--Video

-6.3 动手实践-添加系统调用(系统调用日志收集系统)

--Video

-第6章 系统调用--章节测验

第7章 内核同步

-7.1 内核同步概述

--Video

-7.2 内核同步机制

--Video

-7.3 动手实践-内核多任务并发实例(上)

--Video

-7.4 动手实践-内核多任务并发实例(下)

--Video

-第7章 内核同步--章节测验

第8章 文件系统

-8.1 虚拟文件系统的引入

--Video

-8.2 虚拟文件系统的主要数据结构

--Video

-8.3 文件系统中的各种缓存

--Video

-8.4 页高速缓存机制以及读写

--Video

-8.5 动手实践-编写一个文件系统(上)

--Video

-8.6 动手实践-编写一个文件系统(中)

--Video

-8.7 动手实践-编写一个文件系统(下)

--Video

-第8章 文件系统--章节测验

第9章 设备驱动

-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

直播视频:从Linux内核学习到自主操作系统研发

-从Linux内核学习到自主操作系统研发

附录:实验代码、课件以及相关素材

-各章实验代码

-《Linux内核分析与应用》课件

-《Linux操作系统原理与应用》教材课堂视频

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。