00:00
各位朋友们啊,大家好,我是维克,这节课啊,我们主要是讲解这个Linux内核的一个缺液中断处理。那么这节课的话呢,我们就将。Linux内核常见的一个高频技术面试题,总共是五道,全部啊,列给大家了。第二的话呢,我们学习了这个写实复字。同时我们把这个啊,域名页面缺中档。包括它的掩码分析。我们全部讲完了,以及他整个操作的一个流程。那么这节课呢,我们主要是什么?针对啊。那么这个系统调用的实现v ma和k malo以及什么?开了啊,针对这三个啊。函数进行进一步的调用。
01:00
那么首先我们来看第一个啊。第一个是什么呢?是我们所讲的MOC。这个函数它是干什么的呢?要注意啊,那么VM这个函数。它是分配一块什么,分配一块非连续的一个地址空间,就是它分配出来地址空间是不不连续的,那么它分配的一个物理地址呢,一般是不连续的。但是啊,这里告诉我们了。它的一个什么呢?虚拟地址,它是连续的,所以说它分配的这一个什么呢?内存空间。被什么呢?直接被映射到什么内核的一个数据段当中。所以说我们要从什么呢?你要从这个用户空间的这个角度是不可见的。哎,这就是我们要理解这个函数。
02:02
那么机体的一个什么,机体的一个。内核啊。设计的一个。页码如下,我们来看一下。他怎么做呢?我们首先第一步你一定要找到。找哪个?这个叫做MM啊,内存这个文件夹下面有一个v vlo。用这个函数双击这个文件。分析之后,我们现在啊,就要找到这个函数了是吧?嗯。你要找他啊?CF。V。V这个函数。这里面比较多是吧。啊,括号。来看几个啊。在这里。嗯,这个地方看到没有出来了。
03:01
那么现在我们所观察到的这个什么呢?你看啊,那个星号vlo。里面只有一个参数对不对,这个参数呢,是一个什么,是一个size对不对。那么这个size是干什么?啊,我们知道啊。嗯。再次呢,它此参数。Size。嗯,它表示是什么。它表示的就是说。啊要什么呢,就是你分要分配的一个什么。要分配的地址空间的一个字节数。就这个意思,所以说当我们调那个函数的时候。那么它的一个返回值是怎么样的呢?哎,这个朋友们啊,一定要搞清楚就是。调用这个函数。
04:00
两次函数。那么它返回的是什么呢?就是创建的一个区域,区间的一个什么呢。地址。如果这个函数啊,它分配什么呢?如果分配失败,则就返回一个什么空子。就这么个意思,所以这个问题啊,我们就解决了。好,那么接着我就将这个笔记啊,直接放过来是不是?方便大家啊,课后进行进一步来研究。怎么打?嗯,就这个。那么现在我们就来看这个问题啊,来针对这个问题进行进一步的啊,详细的分析。那么现在我们怎么去测试这么一个操作呢?那我们打开这里面啊。单击文件,这里有个新建,看到没有。啊,新建一个文件。
05:00
倍啊。文件,新建这个文本文件,然后我就把它什么呢保存。哎,我把它保存啊。那我就保存哪里去呢?我就保存那个桌面。那就是V。麦克的一个什么呢?test.c。啊,接着我们就写这个代码。那我们如何实现呢?各位朋友们啊,第一步你要将什么,我们将对应的这个。为malo所用到的一些相关文件。啊, Vm.C啊,这个头文件要把它写上。另外一个是什么呢?Linux里面的init。就这个头文件。第三。还摸了。好,Linux里面什么呀。model.h。都搞定了啊。这三个头文件搞定之后,那么接下来什么呢?接下来你要定一个什么呢?
06:04
你要定一个,就说你要分配多少的这个空间,那么井号DeFine啊,MMEM。那这个MEM的话,这个size大小啊,那我们写什么呢?1024。就可以了,是不是一千零零了,是不是写这么多啊,再定一个指针对不对,那这个指针它的大小。没用到的情况下,我就给他一个什么。给他设一个空子,你看到没有?哎,这么就搞定了是吧,好,那我们设置完那个空子之后呢,那你你要做什么呢?你要做两个点。一个是什么呢?要设置一个初始化这个模块的一个操作,那么就通过这个T啊。Int里面什么呀,这个initt啊,直接写一个什么V,嗯,Malo initt括号V的就行了,这是初始化,还有一个什么,还有一个是退出的星号里面exit exit啊,V。
07:10
Ma_exit。那这两个函数我们就写完了。那么这两个函数的实线我们就放到了对应这个后面啊,各方面是吧,那我们就放到这个后面啊,这里面它有一个返回词,我就零你看。整个操作我们就全部完成了,那么这个地方这个函数它就相当于什么呢?相当于初始化这个模块,这里面就相当于什么退出这个模块是吧,你还什么,你还调用和退出模块,否则你没办法运行了。调退出模块之前,我们有一个什么,有一个model了,嗯。没得下划线什么呢,这个listen。就把这个给写上啊。OK啊。GPL。搞定了,搞定之后呢,那现在你要初始化。
08:01
调用初始化和退出这个模块,那就通过这个model_iit。嗯,第一个是吧。那第二个呢,Exit这个就解决了,那现在就将这个函数名是吧。等于后面这个函数幂放下来你看。这个问题全部解决了,整个啊,整个熟了思路。我们全部搞定好,那么全部搞定之后啊,各位朋友们是吧,嗯,大家啊,如果后面来的是吧,没有跟上前面所讲的这个内容的话,没有关系啊。大家直接找这个贝贝老师来领取我们前面给大家讲过的一些相关的笔记吗?哪些笔记啊,这里面有18个是不是。啊,还包括前面我们所讲过这些了。啊,金三银4LINUX内核的100多面试题了,进程调度算法了,是不是。还有内存管理啦,网络协议站这些啊。好,那现在我们就来回头过来看。
09:00
那现在我如何进行初始化?操作呢,我要分配多少空间呢?那我就通过这个memory size这个指针。哎,就强制转换一下。串一下就可以了,那就通过什么呢?V malo这个函数干什么呢?那么m me s,你看你分配的是一万零二百四是不是,但是你分配是否成功,那我们还做出一个判断呢,那如果这个指针它等于空。指针等于空,我就打印一条信息来告诉别用什么意思呢?就是为M这个函数的操作。操作什么操作失败坏了的。就可以了。然后直接放行。否则,Else。或者else啊。那么这个L的话做什么呢?这个二的话,就输出你所分配的一个地址,是不是因为有这个子针取子向的了,嗯,所以说你这地方就可以打印出来了,双引号v mlo。
10:09
括号啊。多了一个。啊,怎么做呢,这个函数。分配成功。就可以了,成没成功,并且我们可以将它对应那个地址,Address等于什么呢?0X100分号。LX放行。那么你如何输出这个地址来,这个时候你要转一下。什么long?MM_P你看。就写好了,写好之后你看这个我们最后我们返回的是什么零。就这么个意思。第一个问题解决了是不是?那么接下来什么,接下来第二个是不是,第二个是什么exit,那怎么做呢。那现在你这个退出,你就要释放,你要释放那个指针所指向的这一块空间。
11:05
所以的话,在这里我们就通过这个if去判断啊,如果什么呢,它不等于空。就是MP size不等空。那么它不等科的话,我就释放啊。释放就是通过什么K麦这个we mle就通过什么we。哎,通过它去使唤。Besides。就可以了。然后接着我就打印一条信息来告诉用户。就是V这个函数。释放成功。我接着我就直接换行。你看。这个就搞定了,好搞定之后呢,那么最后退出程序。A printed。啊,双引号啊,有一个什么呢,一个。啊,程序结束。
12:03
可以了。啊,写完之后啊,那现在这些我们全部就解决了。那么这些我们全部写好之后呢,那现在我们要运行呢,是吧。运行的话,我就把这个代码框架C是吧。然后放到我们这来。也传过去也可以啊。啊,先建一个文件夹是吧,VM啊。然后你把这个文件夹换进去是吧。然后对应的麦克文件。现在我们直接从什么呢?从终端里面进行进一步的编译啊,这么一个文件。啊,CD什么呢。Desktop。然后这个G。Makefi。
13:02
把它改一下,那我们要把它改,为什么改VM。Test就可以了。保存。保存之后啊,那现在我们就直接什么呀,麦一下。哎,看程序有没错啊,没错了,那么这个程序没错的话,那现在我们编译成功了是吧,麦克成功了啊。好,麦克成功之后,那现在你要干什么呢?你剩下的目录编译成功之后,编译模模块成功之后呢?那现在我们执行这个什么。现在你要执行的是insert mode。就是什么呢,America这个。In a test killed。好,这个时候前线不足是吧。那么insert mode。少了一个KO。
14:01
好,没问题,没问题,那现在我们就看结果。D me几点C看到没有?出来了,现在我们看到的结果是什么呢?你看v ma分配成功,看到没有,然后它对应的地址是多少,地址是0X啊四个啊AB7BC006B0000是吧,就分别出来了。这一块是什么意思呢?大家注意啊。现在各位朋友们所看到的这个函数,这里面它是一个什么?这一块它是因行之号啊,须臾起始弟子啊。是虚拟起始地址,一定要注意啊,虚拟起始地址。那现在的话,我们就把这个。这是我们做的这个程序啊,大家注意了。这个源代码。我就自己给大家啊,放到这个笔记里面来是吧,就是。
15:00
啊,具体的这个系统。调用的一个实现。如下。然后接着什么,接着它的一个运行结果。好,这个是运行结果。嗯,可以了。那么大家要注意啊,这个比较大是吗?变小一点啊。也可以了。那现在我们所看到的是什么呢?
16:01
就是。以上啊,以上这个运行结果。这个0X啊,1234AB。A7B7C006。B0000是吧。这是什么?这是。虚拟起始地址。就这个意思,大家一定要知道啊,这是虚拟的一个起始地址。勋骑士弟子。但是比如啊,我们,但是你通过什么呢?大家注意,比如我们现在要卸载这个模块是不是。I Mo。然后呢,We map k,然后再次我们看一下。你发现没有?这个是什么意思呢?就是我们这个释放成功之后。它所对应的是什么这一块。
17:05
这里面啊,看到没有。哎,这个位置就相当于什么呢?相当于就是说你通过这个什么呢,就是卸载啊。啊,卸载模块,卸载模块时,卸载模块我们一定要用什么,就用刚才讲那个v real。对不对,为负的这个函数,那么它调用的是什么呢?它所释放的一个起始地址为多少?就是上面刚才面讲那个了。是什么呢?是0X啊,12344个F,然后A7B7。啊006,然后呢,B000是吧,就这个意思,嗯,他释放这话地址啊,但是四方是这个首地址,其对应的一个什么呢?大小。
18:10
大小是什么?大小就是刚刚我们写的这个代码。这个是memory size。机体大小是由这个来决定的。就是实话这么多啊。就这个啊。的一个内存块。哎,释放这个内存块。OK。嗯,大家一定要学会使用啊,这就是我们用的第一个。那么接下来啊,我就带大家来来实现第几个呢?第二个是不是。第二个的话呢,我们用的是什么。用的是klo,大家注意啊,K。那么又是怎么去用的呢?哎,现在我们就一步一步啊,就是k medical所对应的是什么,基本就是我们的label这个部分进行操作的。
19:05
那接下来我们就来看第二个。第二个。第二个是K。啊,这个函数。那这个函数呢,它的功能是什么意思呢?刚才那个功能是分配不连续的,那这个功能是什么,是分配在物理。上。连续物理上啊,物理上连续的一个什么内存。但是它这个虚拟地址啊,也自然也会什么呢,也会连续。暗示啊。但是啊。它是什么呢?它是基于我们这个level的一个什么分配分配。它基于这个level分配,实际上它是存在什么呢?存在的连续的一个什么内存。
20:00
就这个意思。那么机体啊,它的一个什么机体函数,这个源码设计啊。就在下面我们来看一下。哎,K麦克它在哪里呢?在我们这个。Label。在include。Linuxin labor。是连曲。那我们找到46H之后,你看就在这里了。看到没有?
21:01
但是们注意因为什么,因为我们在实际应用当中,你这个k ma是分配连续的,那为America是分配不连续,但这里面有几个参数啊,有两个参数。是不是这里面有两个参数。啊,下面进行这两个参数,在这给他备注一下是不是。比如参数几呢?参数角参数一它的一个什么。参数size是不是,它是什么就是。指定什么呢?指定分配的一个内存的一个字节数。啊,内存值结束,这是第一个。哎,参数几呢,后面那个参数啊。Flags。那flags是什么意思呢?就是一个分配标志。那么分配标志的话。注意分配标志。那么就是说大家。可以什么呢,参考。
22:02
参考什么?参考前面我所讲过的。啊,这些也有人说,那你这个到底在哪个地方呢。是不是,那分配标志有哪些呢?分配标志啊,那先把这个截出来,等一下再把分配标志发给大家。我这了是吧。那么它的一个什么flag?嗯,它的一个分配标志。啊,如下。找到什么,找到这个gfp。放看到没有。这里面有哪些,你看。有这个gfp。你可以找几个核心点,他们。
23:01
啊,Gfp。Gfp什么呢?考了是不是啊,Gfp什么user。啊,什么gfp这个DM啊,有很多嘛,是不是啊有很多啊,大家有时候多用一下是不是自然就明白了啊。啊,这就是常用的。把这个问题都解决了。那么这个问题解决之后。这叫什么?这是第一个常数是吧。那么它还有什么呀,还有对那个参数啊,就是你调调的时候大家一定要。多练一下是不是这就搞定了,那么写代码你怎么写呢?写代码很简单呢,你自己在这加一个什么,加一个文件嘛,是不是这个是KML,刚才是VML啊。
24:03
保存。保存kml.c是吧。这是K啊,点C。接着你就直接写代码。写代码呢,它的一个分配大家注意啊。他怎么做呢?首先第一步对不对,我们把这三个的系统的那个案例啊,把它写完是不是。Linux里面的意思吗?H。啊,第二个是Linux里面什么init。对那个什么呀。Model。可以了。莫写完之后啊,那现在你要分配多少个是不是。啊,通过井号。和DeFine。
25:00
M。啊,10240是吧。接着定义什么定义的指针?MEMP。是不是P什么呢,P这个VM虚拟操作啊。没用到的情况下,给它设置一个空值。设置空制之后呢,那接着什么,接着你要设置两个数呢。对不对。Take it。下划线RI是吧。然后接着什么呀,接着我们这个K。Lo。初始化。啊,我的。第一个好,第二个的话呢。我。Exit。Me exit啊,我搞定了。好搞定之后啊,那现在你就要初始化这两个模块,看到没有。
26:04
初始化的那个模块。这个是零。接着你啊,什么这个摸了啊。下划线是不是lessons?那这个啊,Lessons之后呢。标准啊,GP。接着摸了。下划线iit。一个是退出。这两个写完了,你将这个初始化的一个函数。放这来,退出,放到这来就可以了。所以这两个你就全部写完了。那么这个写完之后啊,各位同学注意了是不是,那现在是什么呢?现在就说你要退出操作,是不是退操作,就说你在分配之前,那你肯定要判断了,判断什么呢。你要判断的是这个不等于空间的一个指针。
27:05
PVM,它不能为空。它不为空,那我就刚才的KM,那现在我就KF,前面我们讲过的。Memory什么PVM就可以了,最好就喷K,就是我们用这个函数啊K。成功。就可以了。好完了之后呢。程序就结束。End。那么现在这个部分啊,我们全部搞定了。这只是一个什么释放?释放一些连续的快啊连续的这个内存,那这边的话呢。你怎么去分配来分配很简单啊,分配很简单,那通过这个什么me p vm,它就等于什么。
28:05
等于这个星号。啊,MEM什么呢?大小啊。啊,Gfp里面的一个什么扣就可以了。啊,这个完之后呢,那通过if语句来判断nine。等于什么?等于me p vm?啊,就可以了。好完成之后啊,只要它等于空等于空,那证明什么呢?证明你分配是失败的。所以这个K。麦克这个函数。那就证明你分配失败。分配失败啊。Else。L是什么呢?就是输出是吧,输出内存空间的一个起始地址。
29:02
虚拟这一块啊,K ma这个函数。分配成功。分配成功啊,对应的一个什么呀。对应的一个地址。Address。等于百分之二零X百分之XX。对应一下啊。这个什么。什么?分配什么呢?分配的是me p vm这么一个子称。就这么搞定了,是不是就这么个意思啊?可以了是吧。可以之后啊,那现在呢,你要针对这个函数啊。嗯,所设计的这么一个模块进行什么,我们要进行进一步的测试。
30:02
大家一定要搞清楚,一定要测试。那我们怎么去进行去测试呢?对不对,就是对刚才我们所写这个代码。来进行测试。看啊。我。复制过来啊。
31:27
现在你就要修改一下。把它改为什么呀,把它改为K。ML。保存之后。接着你去麦一下。拼一下这个模块是否正确。好没问题没问题,那现在呢,我们就针对什么平台进行测试一下啊。
32:05
这个模块的一个插入。读了一个一。OK。你看到没有,现在我们所看到这一块地址就是什么,就是分配连续的啊。就分配联系的这个起始地址。那还有一个什么,还有一个是退出嘛,退出就是什么呢?就先把这个解出来。这个代码。系统调用执行。如下。就这把单吗?好,这个大小的话,我们刚才讲变小为力太大了。
33:20
好到这边来啊。那么他这一个什么呀。啊,执行结果如下。执行,删除。
34:03
这种执行结果就成功了。就四方刚刚我们分配这个0XFF是不是四个F905A8A21C后面三个零。啊,这就是一个退出的一个结果。那个地方是释放成功。嗯,搞定了。好,那么这个搞定之后啊。这就是第二个啊,第二个系统,这我全部给他讲完,那么叫大家在实践设计过程当中啊,你得多练一下是不是,为什么是这样,这样做有什么样的结果是不是。好,那现在的话呢,我们接着。那来看一下本节课的一个什么呀。
35:03
第几个?第三个是吧。就是用什么呢?开课了这么一个API操作是不是。第三个啊,嗯。开了。可靠到什么呢?这个函数。它功能是什么呢?功能类似于KZKZ啊,它是什么,它是基于什么呢?基于这个。
36:04
来分配在物理上。连续的一个什么呀,实际内存。并且呢,它在分配内存之后。因为什么呢,又将这个内存中的这个内容啊。都初始化为起来,初始化为零,但是要注意啊,嗯,但是这个K。Call啊。开了。它是。它是什么呢?他。是为一个数组。嗯,来分配这个内存空间。但是你这个数组中的一个元素,它就对应一个什么呢?内存的一个什么对象。就这么个意思。所以大家一定要明白这一点是吗?那么机体的这个什么呀,内核函数啊。
37:02
内核函数。对那个什么呢?掩码设计了,它就在下面了。OK。你看这个函数啊。来展览啊,看见F。Co。就这个函数了,看到没有。K Co。这个函数啊,有这么几个参数啊,我们要注意了,看到没有。那一个是N是吧,Size和flag,那N是什么呢?它告诉我们呢,是严肃数字。其实这个地方它代表什么,代表就是你这个书祖宗的一个什么。严肃的一个个数,就这个意思。那这个啊,Size它表示什么呢?就是指定的一个数组当中。
38:00
每一个元素它所对应的一个什么呀,内存对象的一个什么大小。那flags这个是什么呢?它是分配标志。它提供多种分配的这个啊方式。这个分类标志大家可以看一下,前面所讲过,这里就不多讲了啊。但是最终你操作这个函数的时候啊。就是什么意思呢?就是K。扣了啊。破了这个函数啊,这这这。啊,这个函数。他返回一个什么呀。返回一个对数分配。一个对所分配的这个什么内存对象数组。的一个什么引用。就这么个意思。所以大家有时候要多练一下是不是?
39:10
OK。嗯,我把它放大了啊。那么在大家在用这个函数的时候,它有一个什么问题呢?它分配大小跟刚才我们讲那个都差不多,是不是都差不多啊。比如说你要输出什么起始地址啊,内存空间大小啊,地址偏移啊,这些都是可以的啊。这些都可以设计啊。好,那这些,那么这个就是我们给大家讲解的,其实啊。我们除了这个什么呀。除了这个VIP的一个什么。免费公开试听课,这些Linux内核源码分析这个课程以外啊,同时呢,我们也有什么也对应了这个VIP系统学习班的课程。
40:02
那么我们这个VIP系统学习班的课程呢,它主要是啊,针对具备一定的工作经验,是不是从事内核开发相关的工作这个岗位或嵌入式启动应用啊,或者这个在校大学生研究操系统这个领域的是不是啊面试跳槽的专门对内核这一块的话,我们设计一个啊课程大纲目前是第五代。那么这个课程大纲呢,主要是帮助啊各位朋友们能够尽快啊大生间内提升德纳斯内核野码分析的这么一个啊。还有就是什么呢?还有就是做啊我们的后台服务器开发这相关的。那分为五个专题,那第一大专题是讲什么呢?讲进程管理专题啊,有操作系统与汇编这一块,有进程管理的基础。排的进程调度模块。那么后面还有红色还有相关的这个什么项目实战操作啊,第一个。那第二个的话呢,我们讲的是什么。
41:02
内存管理专题。内存管理专题里面有什么?有内存管理的基础部分?还有什么呀,还有这个相关的操作实战啊。以及什么呢?以及这个内存管理的一个进阶部分对不对。后面还有对应的一个实战操作啊,内存池的一个实现。那第三第三个专题呢,我们讲的是网络协议站,网络协议站的话呢,有哪些呢?第一个是网络基础架构。相关的协议啊。以及什么啊,对应的这个网络协藏的这个架构。超网络协议站的话,还有什么呀,还要对那个这个对那个项目啊。那么第四大专题的话,我们讲的是设备驱动管理专题,里面有设备驱动的基础架构啊,Linux设备的一个模型。以及什么资源分配和字符设备。
42:00
给我们做这个字符设备驱动的一个项目是吧,快设备的话,我们做什么USB啊,这个我们都是讲了啊,都是给大家录好了是不是。大家可以什么呀,可以看到这个VIP里面有对应的课程直接对上去的啊。在这个对,在这来。这里面有看到没有。啊,你比如这里面。为什么呢?对字符设备,是不是字符设备就在这里了,看到没有?那这是字符设备啊。啊,还有什么呀,还有对你比如做这个什么呀。刚刚我们讲那个叫什么,嗯,USB设备,USB设备就在这里驱动开发,你根据这个来就行了,是不是啊,你打开这里面嘛,这里面有对应的笔记,看到没有。就我们的课堂笔记,根据了课程大纲,我们进行进一步的一一的介绍讲解,是不是?那如果大家要研究这个Linux内核源码分析的话,那就直接根据这个来就行了。啊,这就这个部分啊,然后还有什么呢?还有就是我们的网络啊,NIC网络接口卡这一块的设备驱动。
43:05
然后呢?接着什么?接着我们就最后一个模块,就第五大模块,第五大模块就是文件系统跟内核活动这个组件的专题,比如说虚拟文件系统,对不对啊,还有什么呢?还有磁盘文件系统数据同步。啊,以及什么呢,内核活动组建和开源社区。啊,我们把这些全部掌握好了,基本上对领导是力这个相关的一个岗位开发啊提升的话。已经是完全没问题了啊,这个课程大纲大家可以什么呢?直接找这个贝贝老师来领取可以了,所以今天晚上课程我就给大家讲这里啊。我们下一次课啊。
我来说两句