00:00
好的,那各位朋友啊,大家好,我是维克。接下来啊,我们主要是学习这个Linux内核里面的漏洞,安全以这个啊,虚拟的一个物理内存。那本节课的话呢,我们注意啊,从四个点进行学习。第一个是以及内存描述符的讲解。第二个我们学这个内核里面这个写实复字以切叶异常。第三,V ma以及ma系统调用,最后就是CPU的一个熔断和幽灵漏洞解决方案。主要是从这四个点进行了学。那么首先我们来看一下D副图形。我们研究的是红色这个部分啊。内核。Linux内核呢,是基于什么呢?硬件层面上面的和用户空间的一个中间。
01:00
其中我们将内核里面又分为什么呢?比如进程调度啊。内存管理。块,网络管理这一块,以及这个什么呢?虚拟文件系统。进程间通信。拍这个啊,设备驱动等等。那么接下来的话呢,我们掌握啊这个最基本的这个内容之后,那下面我们来看一下虚拟内存管理到底是怎么回事。那么我相信啊,大家都知道我们做过这个项目开发的话,那这个编写过相关的应用程序。那么就是说我们使用的是C语言啊,这个标准库啊,直接调用什么呢?这个API直接动态分配这个什么虚拟内存。那在32位这个空间当中啊。每个用户应用程序呢?它只可以拥有什么呢?3G的一个虚拟内存。
02:00
那么通常要一点大于这个物理内存。那么我们是如何进行管理这些虚拟内存呢?如何管理这些虚拟地址空间?那么用户进程他会多次调用这个V函数啊。或者什么什么呢,A map这个接口映射文件到这个什么呢,用户空间来进行读写操作等等。那这些操作呢,它都会什么呢?啊,都会要求在虚拟地址空间当中进行进一步来分配这个内存。那么内存块基本上都是什么啊,不连续的,就是离散的这个内存块。所以说我们经常讲的这个malo函数是用户态常用的一个什么。分配内存的一个常用接口,我们知道第一个啊。什么意思呢?你比如麦函数是吧。这个函数。
03:00
它是什么呢,使我们这个用户态啊。常用的一个什么呀,分配内存接口,这是一个。那么另外一个什么呢?I map这个函数,嗯。M map这个函数呢,它是什么呢?是用户态啊。常用的什么呢?常用的一个。Map函数使用服态。常用。干什么呢,创建这个什么。创建文件映射。嗯。文件映射。或者是什么呢,或者是域名的一个什么映射啊,主要是干这个事情。那我们了解这个之后啊,还知道一点。进程的这个地址空间在内核当中,它使用什么呢?使用v ma进行了表示啊。就是说。进程地址空间。
04:00
在什么呢?在Linux内核当中使用什么?使用这个structure啊,这个VM下划线有个A啊。下划线什么呢?Structure这个数据结构进行来描述。啊,就是做这个事情,有的地方我们直接把它简称啊,那把简称为什么呢?为v ma就这个意思,所以VMMA这个这个套路就这么得来,是不是VMMA,那么有的地方它也把它称为什么呢。啊,有的地方啊,不同的官方术语描述不一样啊,比如你看这本教材,那本教材ABC,这本教材是不是基本上就这么几个。要么就是什么呢,要么就把它叫做什么,叫做这个进程的一个什么线行。进程。啊,限行区这是一个啊,或者把它叫做什么呢?叫做进程的一个什么地址空间,两种叫法啊,两种叫法。
05:01
那么由于什么呢?由于这些地址空间。它是归属于什么呢?归属于用户程啊,用户进程的要搞清楚啊,要搞清楚啊。这个进程地址空间对不对,就是这些空间。就是。这些空间。它归属于什么呢?归属于用户进程。归属用户进程,所以说我们这个用户进程呢。用户进程它的一个什么呢?用户,所以用户进程,用户进程的什么呢?Structure有一个什么呢?有一个叫做MM内存描述符嘛,叫做什么呢?MM里面。啊,用户进程的这个MM_structure哎,这个数据结构当中也有什么呢,相应的这个成员啊。跟他什么呢,已知。
06:00
跟他。应该这么说,跟他。进行什么?跟他这个进行。对应是不是跟哪个对应啊,跟这个v ma啊进行。跟他这个进行对应啊。就这么意思,哎。跟它进行对应,对应的话就是v ma啊,管理就这个块啊。对应进行vim管理也这么说啊。跟它对应的一个v ma进行管理,OK,就这么描述了是吧,好,那这个啊。我们现在啊,了解这个问题之后,那后面就好办了,是不是后面做什么呢?后面接下来我们首先要学习第一个问题就是PSA。啊。是什么?我们其实跟你讲这个进程呢。进程地址空间,我们就把它叫做什么叫嘛,Process是吧,以及什么呀,嗯,Address。
07:06
多少space,那么我们就称为。什么称为?喂。这个pas就这个意思。它主要是指什么呢?进程的地址空间。它主要是指这一个什么呢?指进程它可以寻子啊,要注意啊,进程可以寻址的一个什么虚拟地址空间。就这么干。那么在32位刚才讲了啊,在32位这个CPU当中。那么这个进程。啊,它可以访问的是四个GB的这个地址空间。但是进程它没有权限去访问这个什么呢?访问内核空间的虚拟内虚拟地址,它只能通过什么系统调用,就这个意思,要搞清楚啊。所以说在什么呢啊,就是在32位的这个啊CPU。
08:02
当中对不对啊进程。30位CPU当中进程可以什么呢?啊,进程。可以行止。可以寻址多少个G啊,四个GB的一个地址空间。但是你,但是你这个进程。他怎么样呢?他没有这个什么,没有这个权限去去什么去访问这个内容去访问啊。就是去寻子了,就去访问这个什么内核的一个什么空间的一个虚拟地址。所以就出来了,所以只能什么呢。所以说他只能通过这个。系统调用的方式进行什么?进行间接的访问,好现在就明白啊,就是说我们这个进程你要访问这个啊,虚拟的这个地址空间。
09:01
那么你没办法直接,你不能直接访问内核,是不是你只能什么,只能通过这个间接的方式系统调用来完成。而且用户空间的进程地址空间,它可以被合法的使用,就这个意思啊。就是用户空间的进程地址。那我们就可以啊,合法的使用,那么地址空间。啊,注意啊,地址空间也称为什么呢?内存区域啊。这点大家搞清楚啊。而且什么呢?而且这个用户空间的一个什么呢?用户空间进程地址的一个什么,用户空间里面啊,用户空间里面的这个用户空间的一个。进程。地址空间。进程地址空间啊,可以什么呢,可以被。访问可以被访问的话,那么这个地址空间。哎,我们就称为什么呀,称为内存区是不是。
10:02
啊,进程可以通过什么进程可以通过这个内核,这个内存管理机制动态进行删除啊,或者添加这些内存区域,就这个意思啊。使我们进程呢,它可以通过什么呢?通过这个内核,嗯。内核的一个什么呢?内存管理机制。进行什么动态的什么删除啊啊。或者是什么呢,或者是添加什么呢?添加这个内存区域就这个意思。所以说。这个什么呢?嗯,Linux是吧。这些内存区域啊,它采用v mi的一个数据结构进行描述,那么我们注意每一个内存区域,你要注意啊。我们所讲的每一个内存区域。它既有一些权限,你比如啊到底是可以写的啊。也可以读的啊,也可以什么呢,执行权限等等啊。
11:04
它都是可以的,这点大家一定要摸清楚是不是好,那我们现在啊,摸清楚这个点之后。那么如果一个进程它访问了不在有效范围的一个内存区,或者是说你非法访问内存区啊。或者你不正确的方式来访问这个内存区的话。就是说他就会报一个什么,就会缺液异常,就这个意思。就是如果啊,如果我们的用户是不是啊,如果我们用户非法。访问这个什么呢?内存区是不是对报错了对不对,那么系统啊,这个处理器啊,就处理器了。嗯。处理器它就报告什么,报告这个缺页。嗯,缺叶。缺液什么缺液异常?虽说。在Linux内核的这个切液异常处理当中,它有些情况你比如啊,如果非常严重的话。
12:06
他就报一个断错误啊。报段错误的话就是什么就终止进程了啊。严重啊,就是严重的情况下。严重。严重的,严重的情况他就会怎么样呢?就会终止啊,终止严重。严重就会终止这个什么。精彩。就这个意思。所以说这个。内存区域要注意啊。所以说接下来我们来看第二个问题,是不是第二个问题。第二点啊。第二点就是内存区域了。内存区域啊。它所包括的什么,包括的内容啊,有哪些?对不对。
13:02
那么它包括什么内容呢?第一个你比如我代码段是吧,代码单映射。代码单映是什么意思?就是说可执行文件当中。它包含。只读或者并且可以执行的这个程序头部。你比如一些代码段或者初始化段等等,就在这个地方。还有一个就是数据当然映射了。内存区里面有数据段啊,数据段的映射。数据的映射,就是说可执行文件呢,它只可可读,包含可读可写的程序头对不对。那么当时他这个数据端啊,或者BSS端等等是不是。还有就是我们所讲的一个什么用户进程的一个什么账。用户进程站一般是在用户空间的最高地址啊。它从上往下进行延伸。那么包含这个什么呢?包含战争呢,或者里面的一些什么呢?局部变量啊,或者一些参数啊,对不对,但是啊注意。
14:05
这个你不能和内和战混淆,是不是因为什么呢?因为这个进程啊,进程内和战它独立啊。并且在并有什么呢?内核去维护,是不是它主要是用于上下文的切换。除此以外,那么还有什么呢?还有C的一个映射区域了。还这个堆啊堆映射区。对映射区什么意思,就是说对映射区其实就是我们经常用那一个函数嘛,用什么呢?麦这个函数啊。就这个意思啊。就用在这里了。那这个麦这个函数它用来分配,就是通过这个函数来分配什么呢?进程虚拟地址就在德映射区这个位置。还有一个什么,还有一个就是a map啦,嗯。I map这个啊映射区。
15:00
Map映射期什么意思?Map映射区域。它是用户进程占下面的。那用户进程站下面我们经常用的叫什么呢?A map啊。I map函数这个系统中,它就用在什么呢?用在a map这个映射区域。这个地方。大家要明白。大家知道啊。进程的。进程的一个地址空间里面的每一个内存区域。你不能重叠啊。两个进程都使用ma这个函数来分配这个内存对不对,但是你分配新内存地址是一样的是不是,但是啊,你不能说明它们两个重叠,就说如果我们啊理解这个进程地址空间的话就很容易了,因为进程地址空间是每个进程可以啊。呃,可以访问的一个。这个什么呢?虚拟地址空间,那每个进程运行的时候都都拥有整个CPU资源,所以说它这里有一个叫什么呢?有个叫CPU的一个虚拟化。
16:05
那么。进程呢,就是每个进程它都有一个,都有一套这个仪表是不是,那这样的话,每个进程呢,地址空间它就相互隔离起来了是不是。是它们这个进程啊,这个进程的一个什么呢?地址空间啊,虚拟地址是相同的。但是经过两套不同的页表进行转换之后,他们就各自是各自的物理地址了。这就是必须啊,用户必须要了解的这个点。啊,所以我们第一个问题我们就解决清楚了。好,解决清楚之后,那接下来我们就来看第二个问题了,是不是。第二个问题,什么意思啊,我们了解就是这个了。是不是内存描述符啊,就是第三个了。第三个嗯,内存描述符是吧,内存描述符什么MM下划线啊,Structure的一个什么。
17:04
结构啊,结构体的一个什么颜码分析是吧。他在哪里呢?要注意。什么意思?Linux内核就是内核,它要管理每一个进程。所有的内存区以及他们对应的一个什么呢?页表映射。所以必须要抽象出这么一个数据结构啊。这就是什么呢?这就是MM下划线,就这个意思,嗯。大家明白啊,那为什么有这个东西呢?原因非常简单啊。它存在的一个什么,它存在的主要目的是不是,主要目的是干什么,主要目的是管理啊,管理进程所有的一个。内存区啊,和什么呢?和对应的一个什么,和他们对应的一个页表映射。也表映射就这个意思。
18:00
所以必须要有这个数结构。但是还有一个问题。什么问题呢?就是我们经常讲在应用层开发的时候,这个进程的什么。进程的一个进程控制块,我们叫做什么叫做PCB了。PCB啊。PCB。PCB的一个数据结构,就是我们经常讲的一个task,下划线有个什么,有一个structure这个了。是不是哎当中它就有一个什么呢?有一个指针啊,有一个指针MMMM呢,就指向什么呢?指向这个MM_structure的一个什么这个。数据结构。现在啊,我们来看一下。你看啊。在哪里?好,我们找到内核源码里面啊。魅和掩码里面。嗯,它有一个什么呀。
19:07
进程。就这个。看到没?诶诶task刹车看到没。进程描述符叫进程控制块,PCB看到没有?啊,当中有一个MM啊,你看啊。应用层对应的。啊,这个。
20:21
好,这个里面。好这个理念。这个里面它就有一个指针是吧。叫MM。嗯,这个地方看到没。求这M,这个M就指向这个结构体了。指向内存描述和这个结构体啊。
21:00
这个指针。你看这就跟它对应关系就在这里了,是不是。我们就可以找到,你看没有。就是你看帕有一个MM指针是不是指向这来。好,那么现在的话呢,我们对应一下,我们来看一下。接下来什么呢?接下来我们具体叫什么?就是MM_charter就是内存描述符啊嗯。内存。描述符MM下划线这个structure是不是?他的一个什么呢。它的主要核心。辰寅啊,具体的一个什么内核,寅卯如下。我们来看一下。那我要找到他一样的了,有个MM_table你看啊。
22:00
这里面。就专门有这个文已经讲过了,是不是你看啊有没有啊,我是给记得跟大家讲过了。看到没有第一个。第一个什么呢。MM下划线这个structure看到没有?找到了啊。你像这个结构体的话。对吧。这个结构体。那首先你看第一个是a map是不是a map什么意思啊。I mapmp就是这里面有一个什么,你看m map是不是这个是虚拟内存区域是吧。在这里它表示什么呢?他进程里面所有的v ma。它就形成一个单链表。啊,这个这就是一个链表头部就这个意思。它的一个核心点就在这。就是这个进程啊,进程里面是不是啊所有的一个什么呀。Vma。它就形成一个什么。
23:01
内存区域啊,虚拟内存区域,它就形成一个单向链表。这个链表呢,就是此链表。他就会什么词,链表就是。就是。这是链表的一个。链表的一个头部,就这个意思。喂。此链表的一个头部。就这么写。就这么简单。还有一个。后面这个纯言是吧。这个是什么呢?RB下划线啊。有个MM_RB。这是通过这个进行来管理的,通过哪个呢?通过这个v m mama区域呢,VI这个红黑素啊。红黑素。它是红黑素的一个什么。根节点就这个意思。
24:01
好,下面这个看到没有。那下面这个函数是做什么呢?你要注意啊。你看这里面有个get。UN map的下划线A是不是?你看这里第一个是文件,是不是第二个地址?第三长度。PG off。Flag。其实这个是判断我们虚拟内存啊。其实你看这里有个MU内存管理,单眼看到没有,配置MU,它这个地方是一个条件编译,看到没有。其实他做这一步的。这个核心点它是这样的。它相当于什么呢?相当于就是说就是这个啊,此函数。它是用来什么呢?用来判断虚拟什么虚拟内存空间的,是否有什么呢?有足够的这个空间啊。判断这个啊,虚拟内存是虚拟内存。空间是否有足够大,是不是啊?那么就是说。
25:01
这它会返回一段没有映射的,没有映射过的这个啊空间的一个什么呢?起始地址,那么这个函数。它会调用到什么呢?具体这个CPU结构的一个实现上面。他可以做到这一点。啊,你比如ARM体系结构啊,MIS是不是啊Linux它有一些相关的对应函数。所以这个问题我们就解决了,是不是?还有一个什么。还有一个是这个你看到没有,有一个I map。是什么意思呢?它是什么?是a map的一个什么?区域的一个基地址,它表示什么呀?虚拟地址空间当中用于什么内存映射的起始地址?就这个意思啊,那就是说我们可以调用这个函数吗?相当是讲是不是来处理,但是啊,但是为我们。就是这个区啊,为什么呢,信用社找到一个合适的例子。
26:02
你比如啊。32位,你比如说32位CPU当中是不是那I map映射起始地址提到就是0X2后面有个什么呢?有4000万是不是它的地址就这么表示啊。那再往后面,你比如说你再找一个核心成阳。那么这个核心成员是什么呢?核心成员比如这个叫做pgd,看到没有这个。这里我们讲过了啊,你看pgd。Pgd是什么呢?它只剩一级列表啊,说白了就这个意思,你像这个成因pgd是吧。Pgd,它是。就是这个指针啊啊。该指针。它是指向什么?指向进程的页表,进程页表就是pgd目录嘛,Pgd目录其实就是我们所讲的一级页表。就这意思。再往下面你看。你看有个auto下划线,有个什么呢?还有个user mm user是不是。
27:04
MMU是干什么的是不是?还有MMC是干什么的是不是?其实这个MMU这里已经有相关的解释是不是?但是啊,如果我们进行进一步的研究的话,其实像这个成年啊,它主要是做什么呢?它是专门用来记录啊,就是登记,说白了就登记啊,登记什么呢?登记啊这个系统啊,它正在使用。此进程的地址空间的一个什么进程的一个。啊,数量是多少。对不对。那么,如果。如果是三个线程。如果是三个线程,共享此地址。空间。那么。那么,此成言。此成也就是这个成员。此成言的一个子。它的值就是为几呢?为三。就这个意思啊。
28:00
好,下面。下面这个MM_CTRL是什么意思呢?就是我们整个MM_structure被引用的一个次数计数器。是用这个参数来完成的。就是你被调用多少次,就这。这个意思啊。这个是什么?就是IM下划线。这个structure这个结构体啊。他主啊。它的一个什么主引用。主引用的一个什么呢?计数器。用多少次,是不是。就这些啊。哎,除此以外,你再再往下面啊。这上面还有很多了,是不是,你看比如这个m m map control是不是。再往后面一直往后面拉拉来看。比如这个。这些弟子是吧?这些。其实弟子。这前面都是讲过的,是不是。还要做后面。
29:00
你的后面有一些核心成员,看到没有。有一个成语叫做什么?统计虚拟地址看一下,我记得有一个叫做统计虚拟地址CPU位图,这个不管啊。有一个。没有啊。有个叫做toler。就这个。在哪个地方看啊。也是在这里面是吧,可能没找到啊,你像这个看到没有。这个是什么?这是统计这个叶的一个映射。它就是什么呢?就是进程虚拟地址的一个总和就在这里。
30:01
这个位置。注意啊。它是什么呢?就是表示。就是表示已经什么呢?已经使用的一个进程地址空间的一个总和。啊,就是统计就在这个地方。好。那这就是我们从从这个啊,内存描述和这个角度来分析这个结果。但是还有一个结果是什么意思呢?那我们也注意啊。嗯。我们可以从一个图形来导图出来。把那个图导出来啊,别着急。代码换过来。好,移到上面。啊,这个是。啊。内存。嗯,内存描述符啊。
31:01
MM_STRU3。对,我们把这个笔记。这么大。没问题,200多行啊。200行左右。那这里面是什么呀。哎,我们用户啊,也可以什么呢,通过这个什么,通过这个呃,通过这个进程啊,通过进程这个角度是不是来什么呢。来观察这个内存管理是不是啊。内存管理这个试图啊。那你怎么去管呢啊?么?如下图。琐事是吧?我们画一个图形来看一下。那这个图啊,我们给他画一下是不是怎么画呢。
32:02
首先第一个问题。刚才根据刚才我们想讲那个笔记,你看清楚啊。这里面。小事。从我们刚才这个笔记里面看看没有。连表啊,这地方。叫做。就这个这个陈岩。啊,这个地方。那么VM_act啊这个。这个结构体是不是它就是一块。内存区域是吧。
33:00
那么它这是一块,它里面包含它就是它这个指针是分别肯定这个指针肯定指向它,所以现在我们要以什么以MM下划线这个为中心啊进行展开。大家注意这一点啊。所以我们怎么去实现呢?你看这边,嗯。比如这个进程地址空间。大小啊。这个来表示的。第二个。第三个。找几个成员啊。第四个。
34:02
六。七个。第八个。第九个。第四个。可以了啊。现在我用这个来表示。其实这个部分啊,这个是内存描述符。内存描述符呢,它也有一个进程描述符跟它对应关系。进程要舒服。这。哎,这是精彩描述。差不多了。进程描述符。好,然后呢。
35:02
嗯,到这来啊。那么这个里面。就给它标上来,是不是给它标注啊。标注什么呢?这个地方是进程描述符里面。塔克下划线。一个是不是。它里面有哪些成年人?我们看过来啊。刚才我们讲这个,看到没有。啊,我就以这个为准啊,第一个。啊,它就有这么一个子针,看到没有。还有一个这两啊,我再再。县城。优先级。
36:05
前面还有。啊,就这么一个意思啊。右边这里面。前面有很多成员啊。后面也有很多个成员。中间这里面啊。有哪些呢?好,我们到这儿来。挑几个啊?比如那肯定是要有的啊。I map,那肯定是要有的。你像这个指针,它就指向这一块。哎,右边这个是什么,这个是内衬描述,你要搞清楚啊。内存描述符。
37:01
I'm。OK是吧,它指向这一块啊。要把这个放到最前面吧。第二个是这个。第三个。再找一个啊。下面吧,指向这等一下我们指向进程地址空间了啊。要指向进进进程地址空间的话呢,必须用sta了。Start。好,这个成瘾。用它来指向。IBAS。指向用户空间还有一个BRK。
38:00
大别克。他们是一块的啊。Start date。Start date。Start date,还有一个end。And。搭扣了。Start cold。代码段再搞一个。刚才我们有一个对pgd。指向页表目录。一起列表。就这些。但是他所定刚才所定这些类型啊。它全部是无符号。长征。
39:03
中间你比如它还有一个指向用户空间的啊。就是指向用户空间和站,这个是指向站。用户空间。他们有一个叫做。Mm map吗?下划线就这个。所以这些他都都给弄好了啊,弄好之后还有一个什么,还有一个就是你这个这一块啊。虚拟内存区这一块。它这个指针。嗯,对,再搞一个这个啊。你比如页表目录了。用户进程。用户进程pgd这个页表。就这个子针的指向。就这个意思是吧。啊,右边这一栏。
40:01
那么来几个什么呢?比如说虚拟内存区域。直接选择复制啊。看下C。它有多少个这样的呢?多少个,它全部是链表连接的啦。这第一个。啊,内存区。虚拟内存区域。叫做。就这个指针来指向的。啊,这个子针指向这来的话啊,就是你这个子针指向这个结构体。指向这一部分。那么这个部分它有一个有几个部分是挨到一块了,你说是不是。
41:00
第二个再来一个啊,等下把它连在一块。1234吗。的四个成员啊。第一个。接着就来第二个了。第二个它也有专门的一个子针,你比如他他一个。假设用这个机停机向这块地方。就可以了啊。嗯,此像这一块要注意啊。这一块里面的话。你比如像这个这个虚拟内存区域。在这里面MM这个点击这里啊。考两个乘也是吧,有这个离合。起始弟子是。啊,起始地址应该在下面。结束地址。这上面。结束。弟子。
42:02
再给他来一个这个。有这个了。会书是吧?除了红黑素,还有一个。在这个新内存。房子啊。不用防止,防止的话我们要单独写啊,那不就不防止了。就是专门防纸箱这个地方,它可以返回返回来啊。还有一个是next。这个。它是个双向链表,就用一个字。我就用一个就可以了啊。我只要用一个啊,所以说它这个指针。就说这个地方。这个指针是指向后面这个部分的。啊,这个地方可以删除了。就这么简单。
43:05
就这个意思。好,我们全部就描述完毕了啊。其实这里面啊,对对,这这。不止这些成员呢,还有很多呢。他还有很多。就这个意思。是吧?好,那现在你摸清楚之后,指示说什么其中之一啊。我们还要还要画一个什么还。下滑另外一个了。看怎么去描述啊。要不没地方不够是。
44:00
移到这个上面来。这样的话就应该有足够的地方。这边。就这指向啊。就这个它可以连成很多很多个是吧,但右边我就画一个什么进程的一个地址空间的一个视图啊。右边画一个进进程粒子空间视图专辑好画一些啊。
45:02
这两个指针。改小一点。这个这个是一样的啊。哎,你上面这个部分是一样的。你跟这个地方。这个是一块的。
46:11
好,那么这些表示完毕之后是不是。但右边右边啊。右边这里我就画一个什么,画一个这个进程的一个地址空间,那么通过这个指针去指向它就可以了啊。大家注意这一点,这个这个点就行了啊。好,那么右边这一块的话呢,我们应该怎么说啊。比如它是四个GB是吧。四个GB的话,等一下这个再改变颜色啊。
47:00
比如第一块内存。这个是大小是不是。这个弟子就自己安了啊。哎,间隙什么之类的,我就把它套上来。第二个是什么呢?再来一个这样的一个地址。这个藏地子。赞就在这里啊。
48:30
再搞一块。Vim地址。
49:00
可以了。嗯,这个是虚拟空间区域,那我再来一个。外卖,再来一个。就可以了。再搞一个非常大的空间啊,用户空间111个一个基B是吧。用户空间。好用户空间,下面再来一个。对。V mi就是对啊。被区域。还有数据档期。数据单,再来一个代码段。
50:02
咱用这个纸瓶指向它就可以了啊,还有代码段。代码端的话再来一个。下面对初始化地址了。啊,初始化地址空是吧。好,现在我们看到这块地子啊,那你比如我们在指向的时候,这个这这个指针啊,你比如这个指针。它指向代码单是不是就从这里指向这个位置了。朝上啊。嗯,用一个。直线。搞一个西线。就可以了。就这指向再来。然后你这个地方。那你颜色保持一致了。
51:11
差不多了是吧。这个你搞一个灰色是吧。搞点灰色就可以了。这个地址。就指向这个地方来。就指向这个送鸡蛋啊。就是你这个数据单。那我这个背景颜色给你改一下是不是。还有一个什么呀。子珍。还有一个堆是不是堆是SBK嘛,Start这个SBK啊这个地方。来。哎,这两个是堆。D的话就用这个颜色来表示是吧,还有你这个BK就指向这儿来。
52:02
把它套起来是不是。这个部分啊。这部分的话。它指向什么,指向用户空间这一块,那就。看怎么啊怎么弄堆到这来到上面部分是堆空间和m map映射空间。映射空间。看一下啊,这个堆的VI mi。它指向他这个没有错。一样的。好,还有一个什么呢,Ambass。那你这个map base,它的指向这块区域对吧。这一块区域。可以搞个sta是不是站。
53:00
就指向这来了。那么它的颜色给它变一下。就这么编啊。RBRB它是个红黑素是不是,这不管它啊。红黑素就用这个颜色来算。啊,这个是指向这个。好差不多了是不是啊,基本上解决了啊,但是它这个什么呢?就是用户空间和内核空间,内核空间这个这个上面这个部分啊,它属于内核空间是吧。
54:01
这个部分它是属于内核空间。哎,这个是Linux内核空间。那么它的机体大小的话,它可以这么标出来,你看啊。用发把它扣起来是不是。嗯,这个是。啊,这个是Linux内核空间是不是。嗯。啊,这个是吧,那你从下面就是用户空间了。从这个地方开始,接着这边是吧。你一直到下面。都是属于什么,属于用户空间。
55:05
就这么表示出来。机体大小啊。用这个来描述一下。这么表示。然后啊,这个你表我们表示完之后呢,那么这个左边这里面是不是你比如这块啊。这这这个。指向占了这个区域,改下颜色。多了是不是?那么堆在哪里?堆是在这一块啊v ma。你要表示堆的话,堆就在这里。
56:04
这一块。这个表示。堆的一个空间。堆空间在这里啊。20号色是吧。上面这个。还有什么M映射空间是吧。映射空间它是用户这一块的啊。从他这里。是接到这个地方来。这个是map映射空间。I map空间啊。
57:14
对应一下啊,基本上思路就这样了啊,然后呢,我们在这一边,那么如果你要有红黑数是吧,那这个地方就指向红黑数了。你发一棵红黑树就可以是吧?放。跑到栅栏啊。啊,红黑书。红黑素这个地方画一个对,用这个一个是吧。三个。这个就指向栅栏,看到没有。
58:22
差不多了是吧。这个是表示。加上v mi的一个红黑数。V ma。红黑素。用这个结构啊来描述是吧,所以你这个指针是不是。就是指向这一块的。嗯,红黑素的话。填充个红色啊。啊,就这么干。
59:15
红黑色在左边啊,对对对。啊,下面是空的啊,下面是空啊,上面这个是根节点,我就我就就用这个黑色来表示是不是。
60:05
你怎么反这个怎么用啊都可以。OK。好,那么所以啊这个。本节课我们主要是讲解这些内容,是不是?大家有时间的时候多研究一下啊。我就把这个笔记换到门课程面。如果大家歇的话,记得啊。直接找我们的这个。不被老师领取可以了啊。OK。好的,那我们下一次课啊,再见。
我来说两句