00:00
好的,那各位朋友们啊,大家好,我是维克。这节课我们主要是讲解这个内快分配器的一个讲解。那首先我们来看第一个啊,怎样创建一个这个描述符。那么在讲解这个基础点之前,那首先我们来看第一个是吧。这个分配器。对不对。要了解什么呢?那么这个分配器。就是前面我们所提到过这个什么伙伴系统,它是用于什么呢?用于分配内存的时候。它是以什么,是以就我们所讲的这个液啊,就是配置为单位进行的。但是说我们在什么呢?就是你在实际当中。注意啊。我们在实际应用当中。
01:00
内存呢,它需求是以字节为单位的。那么如果我们需要分配字节为单位的话。那么小块内存,那我们又是如何进行分配?嗯,就是来解决什么呢,解决这个小块啊。内存的一个分配问题。那么就说呢。你要注意它有一个啊,侧重的一个核心点,我们要搞清楚,嗯,就是这个label。他这个分配器啊。他最终还是有什么呢,还是由我们所讲的一个伙伴系统。来什么来分配出这个实际的一个什么呢?物理页面。但是说。只不过什么呢?只不过我们这个内分配器它在什么?在这些连续的物理页面上,它实现了自己的一个算法。那么对于什么呢?啊,以以此来什么呢?就是我们这个小内存块进行的。
02:05
啊进行管理,这个大家要搞清楚是吧。好,那么关于什么呢?关于这个来分配器,嗯,大家要注意这么几个问题,是是什么问题呢。就是说。针对什么?啊,第二个啊。S分配器,它如何进行分配和释放这个小块内存,这点大家要知道。第二个是什么呢?就level分配器当中,它有一个着色的这个啊概念,那么着色它起到什么作用?还有就是level分配器当中,这个level对象,它有没有根据每CPU做出一些优化操作。那另外一个就是什么呢?就是我们所讲这个内它的增长啊,它会导致大量不用那个空闲对象,那么空闲对象我们怎么去解决。
03:05
这些都是我们要考虑的问题,嗯。那么接下来什么呢?接下来我们针对这个内对应的一什么分配器,它所提供的一个什么接口干什么呢?第一个你是用来创建的,还有什么呢?释放对应的一个什么label。和什么呢?和分配的一个什么返程对象,我们如何进行操作。这点大家啊,一定要搞清楚。那么像这些API函数如何进行应用,你看啊。你比如说它有哪些呢?有我们记住啊,叫做K。Memory_catch。里面的什么呢?啊,123这一个是不是。那么这个是用来做什么呢?这个它主要是创建,首先用来创建label的一个什么描述符,这是第一个。
04:02
第二个呢,专门有一个函数k memory_catch。啊,里面有个什么。这个函数。这个函数是什么呢?是专门来释放我们这个slave的一个什么。啊,那这个描述看创建和释放,还有一个是什么呢?分配缓存对象这几个你要配合使用,是不是,那前面还要分配创建啊。这个加上一个指针是吧,那星号k memory下划线它有一个什么,开启里面的a lock。那我们像这个函数,它主要是什么呢?主是分配,刚刚我们创建一个内部缓存的一个什么对象。那操作完毕之后呢,我们通过KMM下划线啊,Catch啊,Real通过这个函数我们就可以什么就可以释放,刚才是分这个配套啊。
05:02
嗯,它就是用来什么,用来释放这个缓存对象。哎,大家一定要搞明白这个关键点就可以了。好,那我们现在啊,我们搞清楚这个关键点的核心之后呢,那接下来我们就来看啊,对应的一些相关这个函数它如何啊进行应用,大家注意一下。怎么做呢?我们首先啊给朋友们看一下。嗯,我首先找到这个内核源码分析,现在我是以5.0为准啊。专门有个什么,有个MM对不对,他怎么创建level缓存是吧。S缓存是什么呢?在这个地方MM下面有一个什么呢?有个sleep com。Are calm?啊,这个地方双击下面。就有一个size这个这个。
06:04
很多茶等。下划线。嗯,这个诶不对啊。KM。这个啊,在这里。就这么个函数啊。嗯,就在这里看到没有。那么现在各位朋友啊,我们所看到这个,嗯。这个就是用来干什么呢,下面。这个函数就是内核源码里面,它对这个啊,K memory catch create。用来什么呢?用来创建这个内的一个缓存,就内描述这个缓存。啊,描述。描述符是不是啊,就是串式列表描述符的一个什么函数,是不是它就这是这个函数啊,啊,这是其中的一个,大家要理解是不是这是第一个。
07:07
好,这是第一个啊。那么接着什么?接着我们就来看第二个。第二个是什么?第二个是刚刚我们所讲的一个。就这个了。像这个函数,它是做什么呢?就是来释放。嗯。这个是释放什么呢?释放内这个描述,就刚刚你分配的这个啊,操作它就有这个函数进行进一步来实现。啊,大家要搞清楚。的第二个。好,那么接着我们就来看第三个是不是,第三个是什么呢?是分配缓存对象,那就直接是什么,直接刚我们讲了一个K。MM_一个catch。
08:01
She有一个什么呢?A lock啊这个函数。你像这个函数。看到没有这个函数的实现,嗯。这个啊,它设计什么呢?设计的非常好,是不是还有什么,还有对应的一个什么呢?比如这个real。Catch。H它们两个是一个什么配套关系,看到没有?你看它这个设计看到没有。啊啊。好,回车啊。卖到一块就行。
09:05
好,那么现在这个问题啊,针对内和掩码这一块,我们这个函数啊,就全部都搞定了是不是。那么搞定之后呢,那接下来我们就来看下一个对不对。那么针对这些我们如何进行操作是吧,还有什么呢?还有就是我们所讲啊,所用到的这些相关的这个函数。那这些函数呢,大家注意啊。你比如第一个是吧,第一个里面它有好几个参数,看到没有,有什么name啊,Size啊,Flag啊,Flag啊,还有什么C啊这些相关的操作。那么我们所讲这个name name是什么意思啊,就是这个LA描述或者名称,那这个名称我们要自己取啊,是用户自己取。来搞清楚啊,这个用户自取size,就是缓程对象大小,你们可以自己来决定,还有那个就是什么缓程对象需要对齐的字节数。
10:01
嗯,还有一个是flag,就是分配源码,那么center center它是一个什么?Center,它这是一个对象的一个什么构造函数。大家要摸清楚这个最基本的问题就可以了,好,那么现在我们搞清楚这些啊,相关问题之后,那么接着呢,接着你就要来实现了。它怎么实现,实现就是我们要操作的一个什么系统调用。对不对。好,接着我们就先看第一个是不是,那么在操作过程当中,我们在用这个函数的时候。大家注意啊,我们在用这个函数的时候就是什么呢?你看啊。啊,CTRL加F是吧,那有一个什么呢。MM_catch。这个。就调这个啊。
11:05
这里是吧,这个是通过什么,它通过这个这个来设计啊。刚搞明用这个嘛,在这里呢,它就可以一样了,是不是。就这个。好,这就是刚刚我们所看到的啊。那么针对这个的话呢,它的一个设计大家已经知道啊。就是我们所讲的一个什么呢。KMM_一个什么,它一个create,那么这个部分它是如何进行设计的?刚刚已经讲的很清楚了,是不是。它的系统将怎么用呢?是不是啊,所以它的系统将。系统。这样的设计。你看啊。在这里面。
12:01
好,我们再复述一遍啊。啊,在这个位置是吧。就这个。花小啊。改五号就可以了啊。那么针对这个刚才我们讲了啊,大家一定要搞清楚。就是说一般情况下,我们在设计的过程当中。就是我们通过什么呢。就是系统调,它是通过什么。通过此函数。对不对,创建一个什么,创建一个label的一个什么方程对不对。
13:06
那这个通常情况下在内核初始时就可以完成了啊,所以我们需要首次加载这个模块执行就没问题了。就这个问题是吧。啊,那么还有一个什么呢?还有一个参数对不对,你比较参数啊,参数name name是什么呢?就是指我们这个缓存的一个名称。方程名称自己取这个,要知道还有一个什么。啊,另外一个参数这个。Size。S呢,它表示什么呢?指定啊,就是指定为啊,为这一个什么呢?为这个方程创建的一个什么对象的大小。那么它是以什么呢?是以字节为单位。就是第二个参数是吧。那么第三个参数就是我们所讲的一个什么啊。A leg。
14:00
这个参数。那这个参数呢,它是什么呢,就是。定义什么?定义每一个对象?他的一个什么。对齐方式。就这么简单啊。还有一个就是flag。参数,Flags。Flag是什么呢?就是分配返程的一个什么选项,就这个意思。啊,就是想象的一个什么标志嘛,想象的一个标志。啊,大家可以参考啊,前面我们所讲过的对不对。好,那么接下来呢?在这个操作过程当中啊,非常特别啊。嗯。特就是说。特别什么呢?特别重要的一个数据结构,就是我们所讲什么呢,K。Memory catch。就这个数据结构。要注意啊,这个数据结构是什么?是内缓存来描述的一个操作。
15:05
就是说这个结构。他干什么呢?这个结构它就包含什么。包含每一个中央处理器。啊,中央处理器单元,中央处理器单元的一些什么单元的一些数据啊,那么它是一组可以调整的啊。调整的和统计和管理员label信息,大家一定要明白这个最基本的操作是不是啊等等。你看它机体什么机体这个内核啊。掩码结构设计如下。我们来看一下。你看没怎么做啊,大家注意啊,这这几个问题是不是不难啊。那这个我们怎么去玩呢?好,我们找到这边来。
16:03
你在什么呢?在include啊?Linux下面就有个什么DF。这个地方你看。慢慢的开启,就这个。这就可以找到是吧,找到之后你看。你像这个啊。你看k memory catch CPU是吧,什么意思啊,CPU是sleep什么意思啊,这里已经告诉我们了,就是说。每个CPU的一个什么指针数组,它就包含这个空闲对象,本地来告诉我们那个缓存。啊,这是大家要要理解的一个问题,是不是还有后面的一些设计啊,你比如什么size啊。啊,什么me啊part是不是还有这个什么share啊吧啊object啊。
17:00
啊,还有oo啊,马克斯啊,命啊,是不是这里面的每个成员啊。都是非常的重要,是不是,如果大家在研究过程当中啊,多练一下就可以了,这个没什么啊,啊就这个数结构。他的管理看到没有开启management。个数结构啊,那么具体怎么实现呢?对不对,具体怎么实现啊,那现在我们就来看一下。我们先启动这个。啊。在这里面。单击这个文件新建项目。
18:00
保存。那么这个应用。它主要是什么呢?就是针对这个。S。就可以了。你看你怎么分配啊。代码写上去是吧。OK,嗯。首先第一步是吧。要将对应的这个头文件。再加上去是吧。这个什么呀。
19:05
就这个,我先加这几个啊,It也可以了。好,Linux下面什么init解决。接着什么?接着你要设计两个函数是吧,嗯,T。啊。初始化。Cats。它的创建啊。ITFUNC。这是第一个我们就解决了,第二个呢,它没有返回值exit。为什么呢,Catch?那这个我们是什么呢?就是你创建的这个函数啊,你在退出的时候是不是。EXVO,看到没有,就这个意思。
20:01
好完成之后呢,那么接着什么,接着我们注意了。你要定一个指针对不对,你要定一个指针啊,进行进一步的操作是不是。好,那么这个指针我们怎么确定呢?那我就先实现啊。好了。下划线init。啊,Exit就可以了。将这两个函数的实现。放到这面来。啊,这个也是一样是吧。零。看到没有,这就可以了。好,这个写完之后呢,还有一个什么GPL。你这个初始化就放在这个位置。
21:00
你这个退出就放到这来调用。就可以了。好,摸到了下划线。Listen。双引号GPL。你看现在这个我们已经写好了是吧。好,那么这个写好之后,接着我们就下一个了,是吧。下一个。这个怎么设计呢?你这地方首先你得定一个指针对不对,你看创建那个缓存啊,那那描述符。所以你要定一个什么,定一个指针。
22:00
啊,第一个子针叫做什么?就定一个啊,Key memory。就刚刚我们用那个结构体吧。Catch是不是通过刚才那个结构体创建一个什么my catch啊这个指针就行了。PMY。啊,方便我们这个定额。没用到的情况下呢,我就给他一个空子,这就可以了。那么接着现在我要创建来描述服了。创建描数在这个函数里面是不是,所以接下来你就通过什么呢?P my catch直接等于什么等于K啊,慢慢下划线。这个什么呀,里面的这个catch。啊,就可以了。那注意啊,这个名称我就自己写,那我就写个什么呢,MY。啊,My catches是不是这个是名字啊大小。
23:02
自己来决定,你想创建多少啊,都没有关系。那你创建多少个字节?我创建1024个字节。1020这个直接对不对,后面这个参数是什么?那这个是label下划线啊HWK。下划线对齐leg。就可以了,那。这就解决了,解决之后,那么接着你要判断那个指针对不对,看它是否等于空,PMYK是否等于空。如果它等于空,那我们就输出是不是?输入什么,输出你这个函数啊。操作失败。就调用,嗯,就是。嗯,调那个函数创建。创建什么,创建那个。描述符。
24:00
失败。就可以了,加上这句话L是否则是吧。好,否则else还什么呢?L证明你创建成功了,要注意这个问题啊,L创建成功。就调那个函数。就那个函数什么来创建。好,创建这个S列数成功。那么创建成功之后。我们可以是那个把这个地址给打出来,是不是大小啊,把它大小打出来。啊。双引号是吧。就是catch啊,大小啊,SIZE1只多少呢?一只百分之几啊。百分之D。那么这里面我就通过这个求出来了啊k memory什么呢?Catch。
25:04
它有一个什么size。把它这个ti开启,把它求出来就可以,你看。那么现在各位朋友啊,我们得到就是你开多少,嗯。啊,Ch catch side8写就可以了。这是什么?这个是我们。在模块里面,内核调用这个函数的时候,初始化要设计1024个字典三。好,那现在我们搞清楚一下,你24个字节之后呢,接着什么着,我们下一个了,对不对,下一个是什么,这个K开启create,就是你唱这个是四画,是不是四换,我们就直接判断PMY开启就行了。如果他。为非零,非零我就是换。喜欢就k memory开启。
26:01
下划线什么。第一,错调这个函数,然后再把这个指针。写上来就可以了。个释放这个这个描述。好,那我们释放完那个内元素符之后呢,那么接着我要打印个信息呢,来告诉我们用户呢,双引号啊。哎,调用。你看啊。调什么调?这个函数是吧。啊,释放。这个描述符成功。就可以了。公号是吧。好,那么现在我们的目的要干什么呢?要将这个程序去运行一下。看他有没有问题,是不是。好,那现在我们到这面来啊。是。啊,进来。
27:00
那么进来之后啊,各方面啊,进来之后。可以之后你可以什么呀,可以把这些多余的东西把它删除。现在创建个文件夹。我们是Les。Makefi。将刚才那个文件。梦进来,Sir。麦克一下啊。通过通通过这个桌面啊。进来。
28:03
有问题。这桌面了是吧。直接进来了啊。啊,进来之后现在。你要将这个麦克发这个文件修改一下。这字符设备设计的啊。可以了。现在我们就麦一下。写错了我们再修改,现在没有错是吧,没有错的话呢,那么接着什么,接着我们注意啊。啊,我就要将这个。
29:00
模块啊。Do,是吧?In mode。这个Q。没问题是吧。啊,没问题之后呢,那接着什么。啊,我们就DESG-C啊。各位朋友。那现在我们所看到这个结果。提醒我们了,看到没有。TM什么意思啊,你看它这个运行结果就出来了。那些法?调用。看到没有?调它成功大小1024。这个我们就解决了啊。
30:03
哎,就这个。啊,这么系统就能实现是不是。就是程序的一个什么硬性结果。还有一个什么。还有一个对应什么,就说比如你退出的时候就是R什么mod是吧。就这一个啊。前线不行上。好,可以了。你看。它这个调用成功对不对,释放也成功了,你看。
31:02
四分是创建label。两个都成功了啊,这是没问题的是吧。好,没问题,现在我将这个代码把收好是吧。好,这就是我们这个。程序的硬性结果是不是啊,就它的阴性结果。那么它的一个什么呢?语言代码。程序的一个什么寅卯。程序码就是刚刚我们用这个代码。看一下A啊,如果你怕错啊,各位朋友们,如果你怕操作错误的话,你一定要记住。
32:04
在这里面。直接复制这个地方复制了的话,它就相当于什么100%了。没有任何问题了。这个我们就搞定了是不是。搞定之后我们还读几个点啊相关的。另外一个是什么呢。刚刚我们讲了一个什么,讲了一个叫做什么叫这个。看到没有?这什么实现第一个啊。就第一个是吧,那现在我们就来看第二个。第二个是哪个呢?在这里你要注意啊。CTRL加F是不是k me下划线。Catch a lock。就这个函数。啊,现在我们要实现的啊,就这个函数了。好,这个函数的实现。
33:02
它也是什么呢?看啊,它也是基于什么,基于这个KMMK。对不对。大小。密码设好。好设好之后呢,那现在你注意了,当我们用这个函数的时候。它有什么两个常数对不对。一个是什么,一个是A少了一个参数啊。啊,这个可以自己取啊,自己取。比如我起一个。这个参数自己取啊。MY。Catch,什么my catch flag啊,两个是吧?好,那你比如这个参数是不是什么意思呢。就是通过。此函数对不对,从什么从我们给定的啊。从。给定的一个什么呢。
34:01
返程。分配一个对象。对不对,那如果返程它目前为空。那么此函数它就会调用什么,调用这个注意啊。调用专门一个函数,叫做catch。下划线lo里面的种类。通过这个函数。直接向我们这个返程当中,返程中直接增加什么呀,增加内存就这个意思,你为空,那我就直接增加内存。这是这个问题。那比如他这个参数啊,My catch这个参数是不是。啊,参数啊。参数MYK的话呢,它是做什么呢,它是。子向它这个质量就是描述了对不对,他去描述给定的一个什么。描述给定的一个缓存的一个结构指针。
35:02
第一个是不是还有一个参数flags。Flags这个参数啊。它是什么呢?是分配标志的一个什么选项啊。选项参数选项。就可以了。那现在我们就来看一下啊,就是你调用这个函数。电次函数,它说返回什么单词函数返回一个对。返回一个等于什么呢?对你所分配的一个什么内存对象的一个引。这就是我们在用这个函数的时候,就这么个意思是吧。好,那么搞清楚之后呢,那现在你写一把单码就可以了。先把代码,但是这个函数一定要配合前面这个函数使用。一定要配合这个函数啊,配合这个函数。你要先创建level缓存描述符,缓程描述符之,再从这个level描述符里面再分配一个什么内存对象才是成功的,否则就是失败啊,对方们一定要注意了是吧?
36:09
好,那现在我们先看一下这个掩码啊,在后面啊。好,野马,我们来看一下。怎么做?那我就刚刚讲刚才这个程序啊。这个是吧,看C好。那怎么做呢?单击文件新建。保存。那这个我们写的是是吧。Catch,那就是。Slaman a lock。可以了。粘贴把刚才那个代码就放这来,但是你要配套起来,要注意个。你要配套起来,那你怎么配套呢?你看这里啊。配套是这样的。一定要搞清楚lock怎么用是吧,首先第一步你要搞清第一步你这个还是要分配没问题啊,这地方分配没问题。
37:06
那10240呢。等零啊。是不是1000的24个字节一张啊,好,那地方定完了。定完之后呢,那接下来你还有什么。你还设计一个对。你还定一个定一个万能值对吧。位的星号,什么星号?Object啊,没用到,设为空就可以了。首先第一步是吧,我们分配。是不是,那你说这个是分配失败啊,分配失败,那么接着什么,如L是分配成功是吧,你分配成功再往下走了,就这里就可以了。你添加到这个位置就行了,会没点到。分配成功。那我们就首先这个p object就等于什么,等于这个k memory catch。就这个意思啊啊分配一个什么呢?啊,直接a lock了,那么a lock什a lock就是要注意啊,就是PMY开启从这里面。
38:08
分配的gfp下划线。错了,就这个意思,什么意思啊,这里是直接从。刚才分配的。钢材分配这个。描述啊磁那波缓程也可以了,是不是是那波缓程中。分配一个什么呢?内存对象给那个P。分配完之后,接着在这里做这个判断。美啊。嗯,再来做这个班呢。好一服乙烯。如果。如果。如果它等于空是不是?如果等于空,哪个等于空?Object等于空?它等于空。那我就执行这句话。
39:03
第一个函数。对不对,诶。让这个函数创建什么呢?分配。内存。函数。分配内存对象失败。是这个意思。Else啊,就是失败。那么L4的话呢,那你就分配成功了,是不是L4就分配成功啊,你可将这个地址打出来。啊,20的分配成功。那我就双是不是那么A。什么?Alo这个对象啊。好,Object。第一次弟子是吧?0X100分号LX。
40:03
犯。无符号side。看到没有?那么就p object就可以看这部分全部写好,你看。就这么简单啊,它并不是很难,你看现在我们就是说你先分配什么,先分配这个内缓存。然后再分配这个什么,在缓程里面分配这个内存对象给那个给p object才可以。而他整体思路就这样了。好,那么现在我们摸清这个思路之后呢,那接下来你们退出了。退出,你释放是不是释放没问题,刚刚我们讲了。释放,你先释放第一个了。是不是就是你在释放之前,你要先释放什么,先释放object是不是啊p object。如果为非空,非空的话。我就咨询这个了。
41:02
飞空啊。就掉那个函数。Memory catch。有一个什么real什么呢P。Object。那证明什么?我调用这个函数。来释放。内存。释放内存对象成功。就这么干。是不是大家注意啊,就这么简单,然后再释放什么,先释放对象,再释放内返程就可以了。那整个操作都是一样。啊,那么现在夸什么呢?现在我们要进行保存一下各方面啊,先保存一下。将这个代码。放到这边来。OK。先把这个关了啊。
42:02
放一个。现在没使用是什么呀?是a lock。对不对。A lo。诶。Blocks。我这来看到没有。好接着什么,接着打开啊。进来了。好打开进来之后呢,那么G看到没有。改一下。可以了。改完之后,那么接着我们就麦一下。货物了,看到没有?参数是吧。Free。好,那现在我们就对一下啊。
43:05
到这边来。啊,就这一个,看到没有。他告诉你这个。这个参见了没有?MEM下划线开启F。啊,少了一个。还有一个什么,少了一个参数是不是。P。Catch。甩个参数啊。把这个代码放大是不是。保存好。对吧。
44:00
好,再迈克一下。好,没问题了是吧,没问题,那现在我们就看结果。DMS机是不是?杠C啊,先插入。是吧?啊,进入这个高级线是。Kill。啊,现在看到没有,分配成功看到没有,你看内分配成功,在内里面再分配内存对象A。这个成功了啊。你看调那个函数分配。对项对项成功,这应该写错字了,是复制下来的。啊,那改一下没关系,是。两个都失败啊,这地方是分配成功啊。是复制过来描述的时候,描述描述错误是吧。可以了。
45:00
保存好。代码是不是。在麦克一下。没问题。先把刚才那个啊。是。来进行插入。好,没问题,没问题。
46:00
我们看一下。项都分配成功,是不是对项分配成功啊?好,那这个成功者他把上次打出来了啊。他把三次这几个打出来,然后接着什么,接着呢,R'M是不是,你看这个分配的例子出来是吧。ID是不是再来一个什么呀。再来一个这个。K。在什么呀?D me SG是吧,杠C,你看。E。现在全部出来是吧。这就是什么,这就这个啊。释放成功是吧。下面这个。是属于什么呢?属于这个阴性结果。
47:01
可以了是吧,那么这个语言代码啊。就直接什么。直接重加复制就可以了。把代码换过来。OK,你看所以啊,各位朋友们,那么本节课啊说的啊,这个代码运行过程是不是我全部都给他讲解完毕了,有任何问题啊,我们再进行进一步的沟通是吧。你看我们这个insert mode是吧。KO。DS机。那这个是自行开始的啊。好的,那我们下一次课啊,再继续啊,同学们啊,各位朋友们啊,再见。
我来说两句