00:01
好的,那各位朋友们啊,大家好,我是威克。这节课我们主要是分享一下这个利拉克斯内核里面的内存管理源码分析。那这节课的话呢,我们主要是从四个点进行详细的讲解。第一个我们要讲内衬模型与三级结构。第二,伙伴分配器原理与这个系统中。第三,处理器返程跟页表返程。第四我们学习这个什么呢啊。What memory跟那个什么呢?Memory block这两个啊,对应的分配器,它的一些相关基础原理以及。对应的代码时间。那首先我们来看第一个问题,内存模型这一块。就是说根据什么呢,目前啊的情况来讲。
01:03
什么呢?我们一般是将什么,我们是将目前这个多处理器啊,它这个系统呢。有几种呢?有两种体系结构。那么它分为哪两种体系结构呢?第一种,我们把它叫做什么?叫做这个numa,这是第一种结构,那么中文意思我们把它叫什么啊?非一致内存访问,这是第一种。还有一种是什么?还有一种是ST。SMP,我们把它叫做什么呢?一次内存访问什么意思?这个nun整个体系结构它怎么做呢?它是指什么?它指这个内存被划分成很多个内存节点的这个处理器系统。就是说你访问一个内存节点,它所发的一个什么呢?时间。
02:07
是取决于什么呢?处理器跟内存节点之间的一个距离。那么每一个处理器它有一个本地内存节点。那就说这个处理器它访问这个本地内存存节点,那么它的速度肯定比你访问那些啊其他处理器的节点速度要快。所以说我们经常讲这个n ma非一次内存访问。它这种体系结构啊,它适合于什么,适合于这个。啊,中高端这个服务器啊。适合中高端服务器的这些主流体系结构。那么第二种是什么呢?第二种就是SMP,叫做一次内存访问。那么这个一次内存访问。就相当于什么,就是你所有的处理器。
03:02
所有处理器啊,怎么做呢。它访问这个什么呢?内存所发挥的时间是相同的,这一点我们要搞清楚。每个处理器的地位啊,它们之间是一个什么呢?是一个平等关系啊,是一个平等关系。那么就是说所有什么呢?就说在内核啊,大家注意就是相当于什么呢?相当于我们在内核初始化的时候,它是不平等。但是说为什么呢?因为它这里有一个什么,有一个零号处理器作为这个引导,我们CPU负责初始化内核。那么其他这个处理器它要等待什么呢?等待内核初始化完成之后才去处理。所以说我们在什么呀,就是你在这个实际啊。实际这个应用当中,它可以采用什么,可以采用这个我们把它叫做什么混合的一个体系结构。
04:06
在numa这个节点内部对不对,它使用什么呀?使用SMP的一个体系结构。就这个意思。所以这个我们就解决了是不是,但是啊,我们了解这个啊,内存模型的一个体系结构之后,是不是了解这个啊,目前多处理系啊,两种体系结构之后,那么接下来呢,我们要看第二点。第二点是什么?我们要了解这个内存的一个模型。内存模型是什么意思,就是说内存模型我们从什么呢?我们从这个CPU的这个啊,观点这个角度啊,所看到的一个物理内存的一个分布情况。那么内核它管理不同的这个内存模型方式,它也存在什么呢?一定的差异啊,具体要看体系结构。
05:03
那么针对什么?针对这个内存管理子系统,你要注意啊,内存模型里面这个内存管理子系统,它支持三种内存模型。那么第一种我们把它叫做什么?叫做平摊内存。平它内存是什么意思?就是说内存的一个物理地址空间是连续的,它没有空洞,所以这个我们叫做平它内存。还有一种我们把它叫做什么呢?叫做这个啊虚数内存。嗯。虚述内存是什么?就说内存的物理地址空间,它存在空洞。那如果你要支持这个内存的这个什么呢?啊热插拔,那么你只能选择什么虚数内存模型,这是第二种啊,还有一种啊是什么呢?是不连续的这个内存。
06:01
不连续内存什么意思,就是说。啊,内存的物理地址空间,它存在空洞,那么这种模型它可以很方便的高效的去什么呢?去处理这个空洞。所以这些问题是最基本的这个概念。但是什么情况下我们注意啊,有一种就是说什么情况下它会出现什么会出现内存的一个什么物理地址空间啊,存在这个空洞,嗯。这个我们怎么去处理?对不对,大家注意啊,什么意思,什么情况下它会出现这个什么呢?内存的物理地址空间存在空洞。系统啊,其实它是包含很多个的这个什么,很多块的一个物理内存。就说你两块内存的物理地址空间之间,哎,它就存在空洞了。
07:00
那一块内存的物理地址空间也可能会存在空洞。那么就是说这个我们可以看出来,看一下这个分配给内存的物理地址空间啊,通过处理器去查看就可以了。那么,如果。内存的一个地址空间是连续的,那不联系内存模型,它就会产生一些额外的开销,所以就会降低这个性能,大家注意这点啊,就是如果什么呢?如果你这个内存的一个物理地址空间,它是什么是连续的?嗯,它不连续的一个什么呢。啊,不联系的内存模型,它会什么,会产生一些额外的一个什么额外的开销。这个时候它就会降低什么。诶。嗯,降低这个系统的一个什么性能。
08:00
啊,降低系统性能,所以说。我们所讲什么呢?平判。这个内存模型。冰糖内测模型,它是什么?是更好的选择?他来做这个事情。那么就是说,如果这个内存的物理地址空间。它存在空洞,那么我们应该选择什么呀?那我们应该选择这个哪一种类型模型啊。所以。这里它就体现一个问题。凭它内存模型,它会分配。空洞的一个什么呢?配齐的一个结构体,那么它会浪费这个内存。而不联系内存模型呢,它对这个空洞啊,它做了一个什么优化处理。优化处理,就是说它不会为我们空洞分配一个液。和平台内存进行相互比较的话,那么除非你这个内存的物理地址空间。它很稀疏,需要支持什么呢?热插拔这种操作,那么其他情况的话,我们就应该选择什么呢?不联系内存模型。
09:10
这就是我们要考虑的一个问题。那么我们掌握这些问题之后啊。这就是我们刚刚讲的第二点是不是。那接下来我们就来看本节课的第几大点,第三大点啊。啊,第三大点。那么第三大点是什么呢?我们了解什么?了解它内存模型的一个什么?我们叫做三级结构。三级结构什么意思呢?就是内存管理的这个子系统。对不对,它使用什么,使用第一个是节点,就是我们所讲的no。好,第二个呢,就是一个区域。第二个区区是Z是不是。和什么?和对应的液液是什么配置?
10:03
它就直接采用什么三体结构来描述什么,描述这个物理内存。就这个意思。那么这个内存节点要注意啊。内存节点它分为两种情况。那么哪两种情况呢?就是说。Nu mi系统就是这种。非一次内存访问的这个体系结构,这个系统的内存节点,它是根据这个处理器跟内存的一个距离划分的。那么在进一步联系内存呢?这个UI系统当中,它表示什么呢?要比区域的这个啊,级别更高的一个内存区域,那么会根据什么呢?根据物理地址是否联系进行划分。那每一块物理地址联系的内存。它是一个什么呢?内存节点,所以说后面它就出现了一个什么呢,就是你这个内存节点,嗯。
11:06
他就是用一个什么。是一个PG。List什么呢?PG list。通过它直接通过什么,直接通过这个结构体来描述我们这个内存的一个什么。内存的一个布局。布局就这个意思。那么这个布局的话,就是说内核它通过一个节点的ID。来获取我们什么呢?获取这个PG类这个实例。但是它针对这个结构的话,大家一定要多理解,是不是它在哪里呢,你看啊。我们打开这里来算。打开这个内存的一个源码啊。这是我上次写的。
12:03
好,换一个版本啊。有时候高版本大家在用的过程当中,是不是他说不好用,我就换一个试点版本。好,那他在哪里呢?我们直接在这个。Cloud下面它有一个什么,有一个Linux。好linu下面呢,它它就有一个什么,有一个叫做MMZ啊。151啊,你每天都都来是吧,好,那下面看啊。其实我们在在学习啊,提升这个能力的时候,是不是就是我觉得每每一天啊。什么提升一点,是不是每天提升一点,每段时间提升一点,他时间久了,自然而然自己的能力也就会得到提升啊。要看书,一下一下子可能看看不完是不是,但是要分时段去看。
13:04
有自己的规划,是不是这样的话看起来更快啊?我们都成年人,要安排好自己的时间,是不是有你的时间非常宝贵是不是?IM。好,这个地方。啊,找到之后呢,它有一个什么呢?有一个PG。啊,List date你看这个。看到没有,这就出来了,那么现在我们看到啊,大家看到没,我们在内核掩码分析的这门课程里面,你看只有第一个啊,第一个的话,你看这个闹的下划线those。成Z,那么这个城这个书组是不是它是专门什么,专门管理我们这个内存区书组?你比如第二个,第二个的话是什么呢?是一个备用区域数组啊。不用取列表进行操作。
14:02
那么我们除了这个备用以外,那后面接着什么,接了个NZ。这个是表示什么呢?这是表示我们这个节点它所包含的一个内存区域的一个数量。再往后面,你看这里。有一个什么呀?Config Fla看到没有啊,No I mapmp,这个是干什么。这个地方它是除了什么呢?除了虚述内存模型以外。那你比如这个啊,Page有一个什么no map,这个是什么?这个是页描述符的一个数组的一个指针。接着它有一个什么,你看配T就是我们所讲液的一个什么,扩展的一个指定所指相等。啊,这几个啊,大家注意,现在我就将这个笔记是不是。直接放到文章了。
15:02
这第一个是吧,那么第二个的话呢,我们要知道的是什么呢?你比如除了这个节点以外,它后面有几个啊,几个地方看到没有,比如第一个是什么呢?PFM。No start PM,那么这个成员他是说这个节点的一个起始物理也好。下面这个是什么物理液的总数?这个是表示物理范围的总的一个长度,它包括这个空洞。那么这个no的下划线ID,它是什么呢?是节点标识符。这就是我们核心的成员。就是做什么呢。在做这个啊。内存管理的这个操作当中,这个页啊,它的一个核心点的这个成员,我们必须要了解,等一下你写代码的时候就会用到它是吧,好,这是一个。那么除此以外的话呢,我们要了解第几点,第四点。
16:02
第四点是什么,第四点我们一定要掌握什么呢?就是Linux它的一个什么内存节点,是不是就是相当于什么,相当于那个内存区域啊嗯。好内存区域,这个内存节点它就划分,为什么呢?划分为内存区域了。这个要知道啊,嗯,就是内存节点划分成内存区,那么在什么,我们在这个利达池内核当中。他所定那个区类型如下。那现在我们就来看是不是。这第四个啊。那么在哪些呢?同样道理啊,在这里面有个。N table是不是Z1下划线有一个。这个。你看到没有,好,现在就出来了啊。那么现在我们首先看到的,你看啊,一个是咖啡格啊。
17:02
ZDM,这是一个什么呢?这是个内存区域。这个内存区里面它有一个什么,看到没有D大,看到没有ZDN。那么为什么要通过这个呢?这个。它是什么?这个DNA?它是一种什么?直接内存访问。那么有一些设备,你不能直接访问所有的内存。存不能粉丝要输入内存,所以需要什么,所以它需要使用这个d ma,你比如一些旧的一些标准啊,大家注意啊,一些旧的一些工业标准的话,那你比如什么ISA啊,这些相关的总线,它只能访问什么。只能访问16兆内,16兆以下那个内存,所以这个时候就需要我们这个啊。Ze d这一块。啊,这是第一个部分。
18:01
好,那么接着什么,接着他还有第几个第二模块。第二个部分有一个什么?有一个d mi32。那么这个DMS是什么意思,就是说。这块区域它针对什么呢?60思维系统。那么如果既要支持这个什么呢。如果你既要支持啊。只能访问什么?只能访问16兆以下的内存设备,那又要能够直接访问4G以下的32位设备,那么这个时候你就必须要什么,必须要使用这个DMS32,那么这个部分。大家要了解,这是第二个部分。第二部分啊。那么第三部分是什么呀?第三部分就是下面这个了,看到没有。这部分。啊,第三部分就是针对什么normal啊,Normal它是一个什么,是一个普通区域啊普通区域。
19:02
普通区域是什么意思啊?就是直接映射到内核虚拟地址空间的一个什么内存区域。你比如啊,普通区域里面,有时候我们叫做什么呢?叫做只叫做我们叫做啊线性映射区域,也把它叫做什么直接映射区域。那么。我们是否需要使用这个,是否需要使用这个什么呢。对应的一个页表映射,那么处理器架构不同。那么它这个页表映射也截然不同,你比如ARMARM处理器,它就它就需要使用这个页表映射,那比如MIPS处理器,它就不需要页表映测,这就是两者的一个区别,就在这个地方。大家要摸清楚这个问题啊。这一块。
20:00
好,那么接下来我们就来看下一个。下一个是什么?是一个咖啡格,Hi mm。那么这个部分它是属于什么?属于高端内存,它属于高端内存。高端内存的话要注意啊,就是说它针对什么呢?你比如内核和用户的地址空间,如果是32位系统的话,那么按照1 : 3进行划分。所以内核地址空间只有一个G啊,你不能把这个1G以上的内存直接映射到内核地址空间。把不能直接映射的内存划分到什么呢?到这些高端内存区。那通常是把这个什么,通常们把这个DM呀,DM3呀,作为什么呀,和普通区域作为低端内存区域,那64位系统的话就不需要,因为它这个内核虚拟地址空间。是相当的庞大,所以你不需要考虑这个高档内存这个意思。另外一个就是目AB是吧?Mo AB这个是什么呢?这个是可移动区域,它是一个什么,是一个伪内存区域,它专门用来防止什么,防止我们这个内存的碎片。
21:13
大家注意这个问题就行了。OK。哎,这就是我们现在啊要掌握的这个问题。好,那我们搞清楚这个点之后。那么接下来我们就来看什么呢?来看下一个点是吧?下一个点是什么?还有一个什么,还有一个你看这里一个DY。它是一个什么。Device,它是一个什么设备呢?它是一个设备区域。那么这个设备区域。他是做什么?这个设备区就是说它主要是为了支持我们这个持久内存,就是说能够支持什么热插拔增加的一个内存区。
22:04
但是我们知道。每一个啊,你要搞清楚啊,要注意就是每一个。相当于什么呢?每一个内存区域。啊,他就用用一个什么,用一个做。这个结构体来描述。主要这个核心成员。五。就这块。他在哪里呢,看啊。在这里面。啊,就这一款看到没有。那首先你看第一个啊。这个是内存区的一个数据结构。那析数据格的话,你看第一个成员what mark是吧,What马是什么?是液分配奇使用的一个水线,比如低水线高水线什么的啊嗯。另外一个是什么呢?你看low me啊。Receive,这个是什么呀?这个就是说它是一个什么,是一个液分配器的一个使用。
23:04
就是当前区保留多少页,它不能借给这个啊,高的内存区里面去。就这个意思。啊,后面它有一个什么,有一个Z啊PG date,那么这个指针是什么呀。这个指针它主要是指向什么?指向内存节点的一个PT list这个实例。哎,主要是来干这个事情。好,这就是这个部分啊,那么除了这个部分以外,那我们还有什么。还有一个部分,就下面所讲的这个,你看票下划线这个CPU page set。么,这个是针对什么呀?针对每处理器的一个液体和处理。那么下面这个start p Fn是吧?这个是当前区域的一个什么起始物理也好。是吧,他就一个一个来啊。
24:03
你像这个。看到没有?好,那么它出来。啊,这些以外啊。除了这些以外。还有什么下面是吧。下面这个是什么?下面我们针对什么?针对这个物理是不是。那物理液是怎么一回事啊?来看一下。第五个。第五个啊,这个物理。什么意思呢?就相当于每一个就是每一个物理液。它就对应一个什么呢?对应一个配体啊,配体的这个结构体,那配置结构体我们称为什么称为这个叶描述。什么意思?就是内存节点的一个什么呀,PG list。
25:02
这个实力啊,这个实力的成员,它有一个什么呀,No_MEM map。它就指向什么,指向该内存节点。的所有的一个什么呢,所有物理业。所有物理液的一个什么叶描述符,它所组成的一个什么数?通过这个来完成。但是我们在实际操作过程当中。它有一个什么呢。比如说专门有一些相关的这个内列函数进行进一步来完成。你比如啊。在设计的时候有一些什么呢?比如这个section对不对,那这个section是不是section,它是什么?是我们所讲的这个啊系数内存模型中的一个什么。看它断了一个什么。段的一个编号啊,还有对应的node。
26:00
Node是什么?Node是节点编号。还对应什么呢?这它是什么,是区内型。还有你比这个flags。它是一个什么?是一个标志位。就这么算。但是我们在写代码的时候,你看啊。在里面专门有一个什么MMDH,你看这个文件。那么这个文件里面它有一个什么呢。一个函数,你看啊,有个内敛函数。证明那列函数配置。下划线凸。啊,这个。你像这个啊,No the mask是吧。好,没问题。Else in the e。好,那现在我们所看到的这么一个函数。嗯,像这个。
27:02
什么意思,就是说。这是一个内敛函数,搞清楚这里有个阴赖,看到没有,有个阴赖啊,内敛函数。这个内敛函数,它是用来什么?用来得到物理所属的一个内存节点的编号。是不是这这这个要搞清楚了,你看没有。从这个来看啊。就生词。此内点函数。这个配角啊,下划线凸。啊,这个函数。那么内边函数它是用来什么呢?用来获得就是获取什么呢?获取这个物理液。它所属的一个什么内存节点的一个编号。啊,你比这个配给下划线。The number,它就是用来什么,用来获取什么,用来获取这个。
28:02
用来获取到。乌米叶所属的一个什么?嗯,所属的内存区域。的一个什么类型?那么机体怎么去完成?你看有一个刚刚讲那个。刚刚讲的那个叫做什么呢?叫做这个配置。下划线z number。这个函数。就这个。好,这是我们注意这个啊。嗯,就这意思了。好,那么这个我们解决之后,那么我们注意什么呢。其实我们在什么?在专门有一个配置结构体,你看啊,这里面有一个。
29:03
Page。Tables。找到这里面有个配置。Page。那就这个。没有。你看在这个什么,这就是物理液所对应的一个配置。那么这个配置呢,因为什么。你定这个配结构体,因为物理液的数量很大。你要注意这一点啊。啊,就这么干。因为。因为物理液的一个什么数量很大。数量大,所以说我们在什么呢。所以说在配体这个结构体中,我们就要增加一个成员,对不对。
30:05
这样一个成年,那么他可能会什么可能会导致啊。嗯。可能导致什么呢?可能导致所有的这个配给实力。嗯,占用的一个什么,占用的一个内存呢。它会什么呢?大幅度的一个什么,大幅度的增加是这个意思。所以说怎么做呢,一般情况下就是为了什么,为了减少我们这个内存消耗,对不对。哎,减少内存消耗,那么内核就是在什么。在Linux内核。啊,这个结构体里面。那么我们一定要什么呢?一定要尽量的什么?啊,一定要尽量。让他什么呢?让它变小,就这个意思。啊,对于不同。
31:00
对于什么呢?你比如啊,它怎么去让它变小。就是对不同的这个啊。啊,对不不会啊,对不会同时。同时生效的这个成员,那我们就使用什么,使用联合体,联合体它只有一个成员生效这个意思啊。但是要注意啊,这个联合体不用太多,是不是用太多的话,它也会什么也会可读性差一些,是不是就阅读性差啊,其他都没多大关系。这是最基本的一个问题。好,那我们摸清楚这个关系之后,是不是,那基本上就搞定了是不是。就这一块啊。啊,这个问题。好,我们现在就解决了,那么接下来我们就来看本节课的第二大点是不是,那么第二大点能讲什么?
32:04
第二大点,我们主要还是分析什么呢?分析这个火棒分配器。它的原理跟那个什么系统调用。什么意思?就相当于什么呢?相当首先你要了解就是说。啊,Linux内核是不是它初始化。完成之后对不对。Linux内核初始化完成之后,那么它就有一个什么呢?有一个使用什么,比如使用这个液分配器啊。他来什么来管理我们这个物理业,就这个意思。那么当前我们使用的这个液分配器啊,它是什么呢?是火伴。分配器。但是你这个伙伴分配器。它的一个什么特点是什么呢?算法非常简单。啊,并且它这个什么效率高。
33:00
看,这就是为什么我们使用这个火棒分配器,原因就在这里。那么这个。基本的这个伙伴分配器啊,它是这么设计,就是说比如说它有一个什么。比如联系的什么,联系的物理液啊。联系的物理液呢,我们就称为什么称为液块,液块我们叫做什么?Page block叫做液块是不是?啊,还有一个。关键字叫做or的叫做接这个我们注意了。嗯,接。接是什么?皆是伙伴分配器的一个什么?它的一个核心啊,核心专业这个术语啊,专业术语。它是什么?嗯,他是这个。一的数量单位,它是一的数量单位啊,要搞清楚,所以说我们经常讲二的什么。爱的N啊。二的N次方个二的N次方。
34:03
二的N次方个连续的这个液我们就称为,什么称为?N接一块。就这意思。啊,这个二啊要上去。就这意思啊,好,那么就是说我们在什么情况下就成为这个伙伴呢?比如满足啊。满足什么?你要满足如下条件,对吧?满足如下条件的两个。NG。两个N阶越宽,我们就称,为什么呢?称为这个火罐。火罐我们叫做什么?我们把它叫做这个六。伙伴,嗯。怎么做呢?好,这样啊。首先第一个。嗯,第一个是什么呢?两个叶块。
35:00
两个液块它是什么相邻的?积它这个什么物理地子是什么物理地子是连续的,这是第一个。第二个你这个液块的滴下液块的地液,这个物理液号,它就必须是什么呀。必须是二的N次方的一个什么?N次方。这一个整数倍。是吧?还有什么呢?还有就说如果我们合并啊,你合并成N加一,要注意啊,那你N加一接一块。对不对,那它的第几页呢?第一页的物理页号。第一页的物理也好,它必须是什么?必须是二的二啊,二的N加一次方啊。N加一次方的一个整数倍,否则你就不能叫做伙伴。这个上去啊。
36:04
上标调一下。这个也是一样。嗯。那这个我们就解决了是吧。这三个啊,满足任意的两个条件。好,那我们满足这两个条件之后是吧。火光分围棋怎么分?大家注意啊,它这么分的。这个火棒分配器。比如它以单页为例的话,你比如啊单页为案例的话,就是像这么个意思。你看啊。这一块。啊,现在我们所看到的啊。啊,比如。零号。啊,林浩业。一号夜。
37:03
然后呢,二号页。012啊。还有什么三号页。就这么分啊。这是一号页。这是二号页。这是三号页。这是四号液是吧。那么现在你要搞清楚是吧,比如。那不不是要从零开始啊,零开始写错了是吧,零号页。一号业。二号页三号页。现在有四个一。那么零号啊。你要搞清楚了这个。啊,零号。第一号。他们俩是伙伴。对不对。
38:01
然后啊,零号跟一号,零号跟一号是伙伴。二号跟三号。你们两个是伙伴?就这么思路。然后说什么意思呢。还有一点就是这个问题了。什么问题?就是你这个一号和二号。对不对。啊,你比那个一号。和爱好。一号和二号,你们两者之间,你这两你这两个啊。你这两个就不是火花。要搞清楚,你们两个不是火吗?为什么呢?因为你一号一号液和二号页。合并成为一个,合并成什么呢?就是你合并啊,并且要组成一阶一块。所以第一页第一页的一个物理也好,它不是二的底数倍。
39:00
这个它不是的整数倍。所以就搞不定要搞清楚,所以你这两者之间就不是伙伴,就这个意思。嗯,所以你不是二的整数倍,嗯。好,那我们摸清楚刚才那个观点之后,那么接下来我们就来看另外一个问题,注意就是说。虎蚌分配器啊。它分配和什么和释放的一个物理液的数量单位啊,我们就称为什么称为这个结是不是。啊,具体怎么操作啊,是由系统里面给我们自动去完成,但是原理我们搞清楚就可以了。好,那我们搞清楚之后呢,那么接下来有这么几个问题啊。什么问题呢?就是内核啊,它在什么呢?在基本的这个伙伴分配器的一个基础之上。就算出来。啊,进行扩展。那怎么去扩展呢?就说第一个啊,第一个就是说你支持什么,它支持内存节点和区域。
40:04
那就称为什么,称为分期的一个什么。伙伴分配器是不是?第二个。第二个是什么,第二个就是说我们为了什么,我们为了预防这个什么内存碎片。为了预防内存碎片呢,我们就把这个什么呢,物理液根据什么,根据这个可移动性。啊进行什么呢?可移动性进行分组。这是第二个。第三个针对什么,针对分配单页啊,针对分配这个单页,我们做了一些什么性能的一个优化。那么做性能优化它主要是为什么?主要是为了减少这个处理器。之间的一个什么所的一个竞争问题。就是在什么在内层区域。
41:00
增加啊,增加什么呢?增加一个一一个每处理器的。它液的一个什么呢?集合进行完成。主要是做这个。好,那我们搞清楚这个问题之后,那么接下来你要了解。你比如我们所讲什么,我们所讲的一个。内存你要注意啊。就是分期的一个伙伴分配期,嗯,它对应的数据结构。分析。分期伙伴分配器。它的一个数据结构是吧,怎么做呢。刚刚我们讲了。它有一个什么。就是这个分期的这个伙伴分配器。
42:01
啊,伏棒分配器它主是专注于什么呢?专注某一个内存节点的某一个区域。要注意这一点,但是内存区域的一个结构体成员啊。嗯,结构体成员高明有一个什么real。这个A有这个成员,它是用来什么,是专门用来维护这个空闲的一个什么呢。维护空闲的这个页块。但是它这个数组的下标,它就对应什么呢?对你这个叶块的对应的一个阶数。一夜快的结束。所以说在整个操作过程当中。那我们在哪里呢?你看啊,比如这个结构体对不对。啊,结构体就专门有一个。
43:01
A,对不对,它的一个成岩有个什么呀F。对应的一个list。它是一个什么?是一个空闲的这一个液块的一个什么链表,是不是,那NR_real它是什么呢?是空闲液块的一个什么数量。但是说你这个内存区域呢。内存区域的一个。内存区域的一个结构体成员啊,专门有个什么呢脉。面什么呢?面积的下划线有一个什么配极时,它就是一个什么火棒分配器。专门来管理的一个什么,物理业的一个数量。是不是它不包含什么呀,它不包含我们这个引导内存的一个。引导内存分配器的一个什么所分配的一个。物理。就这个意思。
44:00
他整个思路就这么做。然后说他在哪里呢,咱们这里面啊。刚刚我们讲那个。Zone。康F啊。Start in。这里面。啊,这地方啊。他有一个什么,一个free a。啊,这个我们讲刚刚看到啊。啊,这个地方看到没有,在这里。你发现没有,这就出来了,就这呈现。FA。好,你这个free error的话呢,它对应什么,下面专门一个free error,这这这个类型看到没有。
45:04
年表。啊,就这一个。可以这么做啊。这就解决了。所以现在你所看到这个max order的是不是max是什么,是最大的一个什么阶数,就是说实际上。它是可以分配的,最大基数要加一。那默认啊,默认这个值是多少呢。刚才我们已经看到了是吧。默认你看。它这个值的取值是11,是不是默认值是11。那么意味着我们分配,意味你伙伴分配器一次最多只能分,可以分配什么呢?二的十次方。
46:08
对不对,所以说这个需要进行进一步的做出这个配置啊,大家搞清楚是不是。在这里做这个备注啊。就是marks old。Max order呢?它是什么呢?它是最大的一个阶数。实际上。它是可以什么呀,可以分配的最大基数,这个时候一定要什么呀。嗯,最大阶数要加一。那么默认值呢?是多少,默认值是11,所以说意味着我们这个什么,你这个伙伴分配器,它一次最多它可以分配什么呀。可分配爱的啊。十次方一二的十次方。
47:09
哎,你分配二的十次方,这个就解决了是不是,那么你这个二的十次方。那么针对什么呢?前面没讲过啊,就是你最大的一个就是我们要设计,就是你要定义,就这意思。这个当定你看啊。它有一个max,你看这边。嗯,在这里看来。相当于什么呢?这地方你看marks order是不是这个else,看到没有n if啊。你这个要配置了,是不是要配置啊。这是变最大的啊。就是定最大升级内存的空间。通过这个部分进行了决定。我们还可以什么呀,大家还可以根据我们这个分配标志,我们可以得到什么,得到这个啊,首选的区域类型,你比如g FP d m d MSI Mo,还有high memory这几种区域啊,进行进一步的标志嘛,还有这个标志啊。
48:20
就是用的什么自然就知道了。好,这就针对他这一块。好,那我们这一块啊,我们一旦搞清楚之后,那么还有什么呀,还要对应一些相关操作,你比如对列表什么之类的,还有一个什么,还有一个区水线。这是第二个了啊,第二个。第二个,刚才我们讲的趋水性。曲水线是什么意思?就是。首选的内存区在什么情况下会从我们这个啊备用区来借用我们这个物理液呢?
49:05
这个问题你要从水线这个角度去研究这个问题啊,要注意什么意思,比如说首选啊。嗯,首选。首选内存区域在什么情况下?从什么呢?从备用区域。直接什么?借用的一个物理液。这是一个问题,第二就是说你这个问题。这个问题呢?要从什么?要从曲水县?要从七水线开始啊。处理是不是就是每一个内存区域。它就有什么呢,有三个水线。哪三个水仙呢?啊,一个是高水线。高水线,还有一个就是低水线。
50:04
那滴水线。嗯,另外一个是什么和最低水线。那为什么需要这个东西啊?它怎么分,大家注意啊。在这里面,The water。CTRLF。下划线。就这个看到没有。那么就喷出来了。这就是水线。三个水仙啊。那么这三个水线是这样的,比如这个氦,氦是高水线是不是?那高水线是什么意思,就是说如果内存区域的这个空弦液啊,大于什么呢?高水线那说明什么,说明这个内存。
51:04
区域啊。它这个什么说明这个啊,内存区域这个内存它不足。就是勾水线。那么滴水线是什么意思啊?第一,水性。就是说如果内存区了空闲液。页数啊,它小于什么呢。它小于这个滴水线,那么说明你这个内存区。内存它有什么呢?有轻微的不足,就是你这个内存有轻微不足。就这个啊,还有什么,还有一个是命叫做最低水线上面这个。最低属性。那么你这个最低水线是什么意思。就是说如果内存区域这个空弦液它小于最低小于这个啊,最低水线了,那说明你这个内存区域啊。内存严重不足。
52:02
但是你这个内存区域在哪里啊,在我们这下面啊。上面一个。下面有一个水线。看看这个地方。跟这个配套的。你看内存器的内存水平,通过这个来处理。这个来解决,看到没有。这这这就很容易了啊,大家注意了,怎么做就是最低水线要注意啊。好,这样的。这个最低水线。最低水线以下的这个内存,我们就称,为什么呢,称为紧急保留内存。在内层它有一个什么呢。嗯,内存严重啊。
53:04
嗯。内存严重不足的这个紧急情况下。那么会什么?我们就使用什么。我们使用给我最少的紧急保留内存使用。那它就可以释放更多的内存的这个进程。这个可以设置啊。那么就是说,比如设置一些相关进程,内存标志。你比如这个内存管理子系统,它以外的这些子系统,它不应该使用这些相关标志,你比如我们经常讲的例子叫做什么叫做液回收内核线程k swi的啊,K swi的。在,他在什么呢?他在回收液的过程当中,他可能要申请这个内存。那么如果你升级内存标志设置好之后,那么它就调用的时候,它就是什么呢?啊,使用少量紧急保留内存,使用它就可以释放很多很多的一个内存。
54:05
所以说可以,那么可以使用紧急保障内存,但是有个点。就说你比如啊。你申请什么呢?你申请页的时候,比如第一次。第一次,你尝试什么呢?尝试使用这个滴水线。如果你首选的。如果首选内存。区域的一个什么。空闲页数。空行页数啊。它小于什么呀。小于这个滴水线。就直接从什么,直接从备用的一个内存区来借用出来。借用这个物理。就这个意思。就这么简单啊。大家多研究一下是不是,那么就是说如果我们第一次分配失败怎么办?
55:05
你第一次分配失败的话,那你发现所有的这个目标内存节点。这个液回收内核线程,它就通过以什么呢?它以这个异步回收。1亿步这个回收液,一步回收液,然后呢,他就再去什么,再去尝试我们这个使用最低水平。那如果你首选的内存区空弦液小于这个最低水线的话,那就从备用的一个内存区里面。直接来借用这个物理是不是?那你怎么去计算这个水线啊,它是一个非常核心的点。啊,这个在面试过程当中也会经常出现,比如说计算啊。水线的时候。啊,有两个。
56:00
重要的一个什么呢,参数。别着急啊。好。它通过哪一个参数给我们进行计算呢?大家注意啊。在哪里是不是。这地方很底落。第一个是它有个令下划线。它是最小空闲。
57:01
自结束。那么默认值它就等于多少呢?等于四。乘上啊。Loyal memory。S。通过这个来完成。这个有一个公式。这没公式啊。根号下多少多少。稍等一下,怎么这么上?我记得这个公式。
58:21
应该这么算。准备套过来。他过来这个这个查不了公司啊。大家有没有查过这个公式用的不多啊?应该是可以根号下。
59:22
就这个啊。Lo。下划线。Vitas。就这个。抄完之后怎么编辑啊?保存呢?看一下。可以啊,就这个精神没错,嗯。他出来了,算。就是它的一个默认值。啊,默认值就等于四乘上这个就行了。
60:00
大家注意啊。这这类公式啊,如果搞换个自动化的,他快一些,是不是好久没用了啊。好,那么这个me_free better。它是最小空弦值解数,那默认就是四乘上根号下的一个什么呢?Log memory be。但是它有个限制。怎么做嘞?就相当于什么呢。它并且要限制什么,限制在范围,它范围是多少呢?就是从这个128到65535。65535。6536了,是不是啊到636。以内的,嗯。那么其中。是不是其中什么呢?其中这个long m MEM,这个k better。它是什么?它是一个低单内存的一个大小,那么单位为什么呀?单位为KB。
61:04
但是这个我们可以看啊,就是有一个参考专业文件里面专门有这些函数去求出来,你看啊。我记得在这个微软系统里面,它也有。等一下启动了没有。这个值是可以看得到的啊。专门有个函数叫做什么呢?在内存管理里面。MM下面。他一个page a lock分配。Page。嗯,这里面。
62:03
CTRLF中一个init。下线。P啊,就这个。去这个函数看到没有,它分配了。从这个来完成这个函数就可以分配了,是不是你到底分配128还是6536,不是6535啊,是65536到这个范围内。刚才差点忘了,就在这里了。就到这儿来。看到没进步,这么出来啊。但是它有一个什么呢?有一个就是说我们可以通过什么。你可以就是你通过查看这个命的一个大小,它是。在这里啊。记得是在这里。就是在这个VM新内存的一个管理目录下,它就有这个东西。可进行查验。
63:03
好出来是不是就是你研究这个。He。自动适应窗口大小。就在这里啊。好,我们来看一下。他在哪个地方呢?我们这个叫做什么。我记得是终端显示,应该是通过这个对高级选象。有个cat。PLC下面有个SVS虚拟内存下面的云影下划线瑞里面的这个。
64:04
Keys。你看到没有,我这台电脑最少是67584,这是我这个啊。是吧,这个是这样的。嗯,就这个。好,这个问题啊。
65:05
好,那先看下一个。下一个是什么呢?还有一个是水线。水线缩放因子。就是在什么呢?在Linux内核。还有一个什么水线。水线缩放因子。水性收过因子啊。那么它有一个默认机体啊。要看什么呢?要看内核的这个架构。也不知道多少,是不是好像他可以查的出来。在哪里呢?通过这个cat。PC下面的SOS。好,那我们在什么?在SYS后面。对应什么呢?VM跟VM你看啊。
66:01
VM下面有个water。Mark。比例因子。默认的情况下啊。这里是十。这就出来了。好,这个是完全没问题。摸是。默认是。木子。好,那么还有什么呢?还有就是说我们可以什么。刚才我们讲了它有一个什么呀。就是在系统里面。就是在什么,就相当于在离那内核当中,对不对啊。
67:00
函数就下面这个函数。那函数列就刚才这个啊,叫做set off。下划线有个票。啊,这个地方。有一个waters这个函数,看到没有?来注意这个函数啊,这个函数是干什么。是计算每一个内存区的最低。就最低水线和低水线,高水线就通过这个来完成的了。这个。此函数是不是?哎,此函数。负责计算。每一个内存区域的一个什么。最低水线。
68:01
还有一个什么呀。滴水线。和什么高水性?就这意思。所以说最低水线的情况下,它有有这几种情况要注意啊,有这么几种情况。那么哪几种情况呢?就是说你比如这个计算。计算最低水线。嗯。他这个方法啊。你比如命。M mre。这个什么pages,它就等于什么,等于下划线real。BAS。对应的一个什么页数?这是一个计算方式。就是计算滴水线的时候啊。计算我们最低水平的方法。就这两个是相等的。另外一个是什么呢?Law。嗯,Me,下划线有一个pages就等于什么,等于所有。
69:05
等所有低单。内存区域中这个什么呀。伙伴分配器,它管理的一个什么页数的一个什么总和。就这么简单。这是其中一个。啊,除了这个的话呢,还有什么,还有高端内存区。嗯。高端内存去计算这个最低水线。它就直接等于什么,等于这个啊,这个指针直接指向。这个麦的下划线。配几次直接除上1024对不对。那么你除以千024的话呢,这个时候你并且有什么要限制的范围多少。在这个32到128。到120方以内的啊,以内的一个什么操作。嗯,一定要注意这一点。以内的。
70:01
就是说。就是作文所指向麦的page。它是。这个是什么意思?这个是内存区域伙伴分配器管理的一个页数是多少?在内核初始化的过程当中,这个引导内存分配器出去的物理液,它不受到我们伙伴分配器的管理,就这个意思。这是我们计算这个什么。计算这个最低水线的方法是不是这第三个方法啊。第四个方法你怎么做呢?在低端内存怎么做?比如在低端内存。滴答内存区域。它的一个什么最低水线。它等于什么呢?等于命下划线,Free。配是乘上什么呢,就。所指向的一个什么麦的。
71:03
佩奇斯。直接涂上no。眉毛的什么呢?配解释。那就可以了,什么意思呢?就是m pageis。这个子啊。这个值它怎么得来的?这个它是按照比例的啊。这个是按照比例分配到每一个低端内存区。这就是我们计算什么,计算这个。最低水线的方法。就成这么几个四种。这个问题就解决了。好,那么接下来我们就来看第二个啊。比如你计算低水线是不是跟高水线,又是怎么计算的?对不对,1 : 0计算啊。比你要计算这个滴水线。
72:00
和这个。高水性的这个方法。那你比如它有一个增量,是不是增量是什么意思,增量就直接等于什么呀,等于我们这个最低水线。啊,最低水线除以四。是吧,同时你这个指向啊,入趋指向。啊。下划线什么配置是乘上?这个what mark?再除上1万就可以了。哎,这样的话,他就取得什么。它就会取这个最大值来完成。就这个意思。那么你这个滴水线。对不对,你滴水线就等于什么,等于这个最低水线,再加上这个什么增量就可以了。
73:00
哎,除此以外还有什么高水线对不对?高水线怎么算?高水线呢,它就等于什么呢,等于这个最低。嗯,最低水线加上这个增量再乘以二。啊,这就是计算的一个方法。哎,如果你要简化操作的话,怎么操作呢。就是啊,要注意啊,如果比较大。如果这个最低水线。它除以四是不是它比较大,那么这个时候你计算什么呢?你计算公式的一个什么,计算公式减法怎么算呢。第一个就是你那个滴水线。啊,你滴水线就等于什么,等于最滴水线。直接乘上5/4就行了。这是一个方法,是不是另外一个就是高水线计算。高水线就直接等于什么,等于这个。
74:03
最低水线沉渣多少呢?啊,三除以二。就解决了,你看。他这个操作方式就这么简单。好,我们注意这么几个方法就可以了啊。好,那我们了解这个问题之后,你还注意什么呀?在实际操作过程当中,你比如你要什么,你要防止我们过度的借用内存啊,是不是什么意思,就是说啊,比如和一些什么呢,你和这个高区内类型相比的话,你比一些低区类型的这个内存相对要少一些。所以说他是稀缺的一个资源。而且它有一些特殊用途。你比如一些什么DMM区啊,DMM区它用于什么呢?用于外围设备跟内存之间的一个数据传输。
75:01
那么我们为了什么?为了防止高区内内行?过度的使用低区类型这个物理液,所以说它这个地区类型需要采用什么环卫的一个措施。保留一定数量的物理液,就是说一个内存节点的某一个区域类型,它要从另外一个内存节点的相同区域来借用物理液。这样才可以。否则就解决不了这个问题。大家知道这个问题啊。好,那我们搞清楚这个问题之后,那么接下来我们就来看一下啊,相关的一些基本操作,你比如我们在操作过程当中,你如何分配这个液是不是。你看啊,这第三个了吧。嗯,下面是第四个。
76:07
啊,第四个啊。第四个数就是分配这个液。分配液。分配液的话,那么它是通过什么。是通过液分配器他所提供啊。提供分配液的一个什么呢?分配页的一个接口操作。那通过哪些呢?你比如啊,比如你分配多少个。那就有这个,嗯,经常讲。叫做。Lock_page。这第一个。第二个。这个是什么意思啊,这个是直接请求,这是请求。分配一个基数。
77:01
分那个阶数为多少呢?为word。Word的一个什么页块?它就直接返回一个什么配给这个实例。就这么个意思。大家注意这个点啊。除了这个API函数以外。它还有一个什么,还有一个这个get下划线有一个。Pages。这个函数。那么它直接这个函数,它是对什么?是对函数a lock pages。对上面那个啊,在这个函数呢,它做了什么,做了封装。对不对,它只能从什么,只能从低端内存区域。来分配这个一啊。并且它返回的是一个什么虚拟地址。一定要注意这个问题。那具体分配标志的话,前面我们就讲过,你看。你在我们在设计的过程当中。
78:02
多研究一下是不是。这个事情就可以解决啊,那么研究的话就是你要通过代码去实现代码实现page,那你就要写一张代码,是不是,就是内存这个分配的一个领域里面找到一个它的一个系统调用是不是。看啊。他怎么做呢?你比如你在这个。你看啊,机体。A lock_pages。函数机体。这个在Linux内核。掩码的设计如下。就这个。那么他这个设计的话。他如何进行实现呢?你要找到这来。
79:02
装了一个gfp。在这里。康。看到没有?调这个函数。看a look pages看到没有?啊,这个函数这个B看没。摆在这里看看。它是一个什么内敛函数?就系统就会亮这个地方。
80:02
好,那么它系统调用这个地方的话,你看啊。那么具体的实现。是吧?啊,具体的实现嘛。如下,你看它怎么用啊。那你比如第一个是吧,第一个参数你要注意啊,它有两个参数嘛,是不是有两个参数啊。那你比如第一个参数是g FP mask是不是?参数。参数gfp,下划线这个mask。它为什么它为这个分配标志。要注意这个这个点就行了。啊,除此以外。它还有一个参数呢。是不是另外一个参数是对应什么这个参数这个。参数。它是指什么?指我们要释放的一个什么物理液的一个什么物理页数?
81:07
那么它的一个什么呢?它的一个取值为什么。取值为二的什么二的一个二的次方?就这么个意思。就这个函数的一个实现啊。那你你要写就是它对应的代码,你怎么去用呢。在这个位置。好,就这么干了啊。
82:08
你把它放桌面啊。来写一个什么?这个是a lock。Look page a page.c。来换桌面啊。大小的话,我们根据这个来啊。嗯,现在我们讲相关的这个什么。Linux的一个头文件,把它搞定。好,那下面的什么呢?莫德了DH。还有一个是Linux的一个什么gfp.h。
83:03
Innu里面MMH。Nu里面什么MM下发线开点。这个写完之后呢,包括什么,包括我们要设计的一个什么。初始化这个对应的a lock。配里面的什么init这么一个函数,把它设计好。先给他声音好。Take我啊。EXIT。那这个exit的话呢,A lock pages。这个是黑除,是不是解决了?这个解决之后呢?那么接着什么?接着我们通过这个structure。Page啊,第一个pages。没用到情况设为空。就可以了。线,就是说你要针对这两个函数进行进一步实现,你实现完之后呢,你再写一个什么呢?比如这个model的下划线。
84:07
嗯,Init init的话,你就叫上面那个AO pages。哎,下滑下I,把这个函数名写掉就可以了。还有一个什么ex。调用初始化推出这个模块,嗯,配置是it是吧。还有什么,还有就是这个标准。标准的话非常简单。标准怎么做呢?那你就通过这个model了。啊,摸到了下划线。Licenses双引号里面的GP。GPL。双引号就可以了。这个写完了,那现在你要实现这两个啊,你看。
85:07
好,返回零是吧。第二个。再复制一下是。到这边来。粘贴。啊,那么你这个退出是不是。退出非常简单,你我们就直接什么,直接在这做出个判断,就是说如果我们这个配置是吧。啊,会计时它不为空是不是。那你pages不为空,那我就释放了real下划线有一个什么pages。那么机体放多少?假设你要分配什么?你要分配。32你如果你要分配32页的话,那对方可是5I的五次方,要注意啊。二的五次方。就这个意思啊。输出。
86:00
跟这个双引号啊,下划线。Freely pages。OK。发行你看。这已经写好了,是不是这个是退出操作啊。那我们这个退出之搞定之后,是不是还还有一个什么是二的五次方嘛,你二的三次方就是八个,你二的四次方是六个。嗯。32个的话,就相当于什么,就相当于这个五次方是不是。好的就解决了啊。那还有什么呀?还有就是分配。台阶烘焙。那这个分配没问题。分,你只记住一个点。通过这个配置是等于什么?A lock里面的page。Gfp_cor。逗号多少写个五是吧。五的话就相当于。就相当于分配。32个物理是不是?那接着判断,你只要这个page以为空虚环变为真是不是?
87:06
那么就直接返回什么负是吧?En me。就可以了,Else。嗯,Else,就分配成功了。那么分配成功啊,这个代码各位朋友们就自己写了,是不是咱就不多写啊,你就把这个函数分配成功,可以将这个子针这个地址把它打出来是不是。所以说啊,那么今天晚上啊。这个。Linux内核野码分析这个VIP啊,这个免费公开试听课,我就给各位朋友们讲到这里,那么大家在学过程中。有哪些还不明白?或者不理解是不是没有关系啊,可以通过什么呢?我们有一个这个对应的Linux内核研码分析这个课程大纲。大家根据这个课程大纲就可以进行进一步的了解是不是?
88:02
我考试研究过rds入侵系统。我有个朋友说,毕业论文。你要搞入入侵系统啊。等一下啊,我点这里面算。注意在这里啊。弹出来了是。主要分成五大模块啊,我发出来了啊。地道模块就是进程管理专题。第二大电力内存的,第三大网络协议站,第四大就是设备驱动,第五大就是稳健系统,主要是分这两大块。你要搞ids是吧,你那个朋友做论文啊。他是研究就是硕士还是本科,嗯。本科本科应该没那么难吧?
89:03
一般就是说这个问题啊,就看我们怎么去理解了。就是针对这个网络安全,它是安全策略,这些网络的一些系统。你这rds,你比如说你设计这个架构的话。一般你比如这个。比如说高可用性的IPS跟什么ids啊,它综合。就是你通过这个离光情况下是不是。那。一般情况下怎么做的呀?大致思路是不是你通过高可用了一个。IPS是不是?要结合这个。Ids。对不对。它就构成一个什么,构成一个黄易性的这个啊。网易性啊,就是入侵防疫的一个方案,比如你要把一些主业务服务器,是不是还包括什么因特网啊,对不对,还有这个对应的什么交换机啊。
90:03
整套体系有基站里面的IPS。你怎么做是不是?这些啊。还有一些什么啊,比如什么分布式的ids中心,一些控制台是吧,还分布式一些网络引擎,就这它整套。它并不是单方面。有少的有有有的有时间吗?你可以研究一下是不是。到时候你比如你怎么切,你比如你把如何去,你怎么去保护一些资源,是不是,你比如在服务器,服务器七的交换机啊,或者因特网接入路由器之后,第一台交换机怎么做是不是。啊,比如你怎么保护这个网站,包括这个网络交换机,它入侵它的一个操作是不是。啊,怎么去大致了就是就是入侵检测,你首先了解这个入侵检测大致几个方案就可以了,是不是。
91:00
比如他从信息收集。他有信息收集入侵方式,或者信号分析收集入侵方式。啊,这个的这个的话,你有有需要研究,到时候来进行研究啊。哎,151的跟这个不算。就我们这个这个。好,那今天晚上的课程啊,我就我就先下课了啊,嗯,那么就再见了是吧。先把这个保存啊。
我来说两句