00:00
首先欢迎各位朋友来到铃声教育啊,我是维克。接下来啊,我们主要是学习这个啊,Linux内核里面的一个物理和虚拟内存的管理。那么通过这第一幅图。和第二幅图,我们就了解这个什么呢?Linux内核啊,空间所分为的各个模块。那我们这个课程呢,主要研究的是啊。进程调度,还有这个网络协议站啊,设备驱动程序。文件系统和内存管理啊,还有其他的一个附属的模块。那么这节课呢,我们主要是学习什么呢?一个第一个是系统调用。第二个呢,是虚拟内存对应的一个什么。进程地址空间。第三个是页面回收与切页异常。第四个是内存规准以及页面的迁移。
01:01
那么首先我们来看第一个,那我们在啊研发过程当中,那么有一个啊,非常重要的点什么呢?比如k malo啊,这个函数是不是除此以外呢?你比如ma这个函数啊是吧。还有什么呢?还有VM。这些相关的函数,那么这三个函数啊,嗯,这三个函数就是这三个,它是什么呢?是常用的一个什么。常用的一个接口函数。非常啊。但是这三个之间是非常的相似啊。但是实现上啊,大家也可以进行进一步的研究。那首先我们看第一个啊,讲一个比较常用的,比如K。K这个函数呢,它是基于什么?它是基于内部的一个什么快的一个什么分配器。
02:00
但是我们都知道这个slave的一个什么呢?它的一个缓冲区啊,它是建立在什么,建立在一个啊。建立在一个屋里,弟子啊,嗯。物理地址连续的一个什么呢啊。大的一个什么内存块啊。上面对不对,嗯。就这个意思。所以说它的一个什么,所以说它的一个缓存,缓存对象啊,它也是一个什么呢?物理地址连续的。就这么个意思。但是我们知道如果啊。如果在内核当中不连续的一个物理地址。而且呢,它仅仅是什么呢?仅仅需要这个什么内核空间的一个虚拟地址,是连续的内存块就可以了。那么就是说这个时候我们就是可以使用什么呢?使用这个vlo进行进一步操作,嗯。
03:04
但是要注意啊,We的一个使用呢,你看啊,我们在什么呢,在这个。在内和野马里面,我们可以知你,看它怎么生你啊。嗯,大家看声明啊。嗯,第二个是。第二个是什么呢?是V。啊,Malo这个函数。他的一个生命。那么他的生命的话是这样啊,生命。打开这边。在这个内核野码里面找到这个什么呢?MM看啊。好,那么在MM里面呢,它有一个什么呢?有一个VM。嗯,这个。双击之后啊,注意啊,我们找到地方之后呢,你找到这个V函数就可以了。
04:00
就这么一个函数,看到没有?看到你看就这个很做。那么现在我们所看到这个函数就是它的一个定义,看到没有啊。啊,它的定设计啊,它的一个定义设计。它那个定数机要搞清楚啊。先调用它是不是,然后再往这一边进行,进一步执行到没有两个下划线,看到没有,有一个numa no no是不是。但是要注意了啊,这个vlo这个内核掩码分析设计的时候。它的架构就是这样子的。啊,所以我们搞清楚的,这是第一个看到没有。在这里啊,嗯。那么现在的话,我们就回到这儿来是吧。什么意思嘞,微马拉函数的声明啊,具体的这个什么呀啊,内核的啊。码如下。就这一块。但是我们知道一般是什么呢,比如你从4.0的版本啊。
05:04
或者是4.12是不是。但是要知道一点,就是如果是5.0要注意啊。这个V这个函数。啊,为那个函数啊。它在什么呢?它直接使用什么,就是这个函数,它使用什么,使用的这个分配的一个源码。分配这个野码。分配掩码是什么?就是它是一个。Gfp下划线啊。颗粒了,是这个啊。但是如果是啊,对。这个是基于什么呢?这个是G5.0的这个内核你要搞清楚。那如果是4.0,它还有一个参数。如果4.0,它还有一个参数啊。这个我们得研究一下是吧。OK,嗯。这并不是什么呢,这并不是说明函数啊,它不再使用什么呢,高端内存就这个意思。
06:07
那当我们在调的过程当中,你看啊,再往后面,你就可以往后面深入的进行进一步你看还有一个。还有一个你看啊,刚才我们这边还有一个叫做什么。啊,它有两个下划线,看到没有,嗯。这就出来了,看到没有。就这个函数。就这一块啊。哎,框架C是吧。那首先你看第一个是吧,这个函数里面包含什么呢?Size。Gfp_mask还有什么呢?Pro它总共分为什么?总定调那个函数它总共分为什么?分为三个参数,是不是三个参数啊?那么这三个参数在内核里面,它分别是用来干什么的啊?它功能是做什么,这一点我们要搞清楚啊,你看。
07:04
好,那接下来我们这个就出来了是吧,你比如这个第一个啊,这个gfp下划线这个mask。那么这个成员就是这个参数啊,这个参数,这个参数它是什么。它是我们这个页面分配器使用的一个什么呀,分配源码,这是第一个是吧。第二个是size。Size就是你分配这个内存的一个大小。第三个。那第三个是什么呢?就是pro啊,这个参数,这个参数就是你分配内存的一个什么呢?内存的一个属性。啊,就这么简单。那么我们有一个什么呢?比如下划线,你看两个下划线VM这个接口啊,是用来分配这个内存。这样做的好处呢,它是指定什么,直接指定这个g FP mask的一个掩码,是不是啊,这个掩码,这个我们后面可以进行什么进一步的研究啊。
08:03
来可以看一下是不是那么了解一些什么呢,它一般都是这样做的啊,你可以在驱动块里面可以找到这个什么,找到对应的一些相关词啊,进行进一步来完成。哎,它就这么一回事,好,那么we这个这个实现的函数核心你要搞清楚啊,要注意了。你看其实它就是上面对那个问题你看啊。怎么做嘞?好,我们CTRLF,我们看这个内核源码。内核页码里面有个什么,有一个你看啊下划线,你看它有个v mlo,下划线有个什么呢?No。线下划线一个什么。Ranch。有这么一个函数,看到没有?真正的核心函数就在这个地方。算真正的核心的一个函数,你看。就这个啊,大家一定要注意了。C是吧。啊,它的一个真正函数。真正函数啊,你分配节点的时候,它真正函数就跳到这来,那么跳到这来之后呢,你看啊。
09:05
他这个no下面是不是就是我们。即将要设计的。就是这个调用的时候,它这么一回事啊。他怎么做呢,你看啊。在这个地方。其实这个V。了。这个函数它的一个核心实现对不对。它的核心实现主要是什么呢?在调用我们内核里面专门用什么呢?用刚才我们用这个函数,就这个函数。稍等一下啊。这样不行是吧,那下划线了自己写啊。V。没了。下划线no里面什么呀。RA。它这个函数进行来实现的啊。实现操作是吧。嗯,机体如下啊。那么就从这地方跳到这来。
10:06
这个问题就解决了。就说内存之间实现的一个关系啊。核心点就这个函数。你像这个函数出来,但是这个函数出来之后呢。我们有一个什么,你看啊,当我们调用这么一个函数的时候。你看用这个函数的时候。它有一个什么,有一个你看VM看到没有VM你看啊vlo。Start。We end其实。这两个它只是一个非常重要的红,对不对。这个红的设计。他在哪个地方呢?你看啊,这个好的设计它是这样的,嗯。对,给大家找到这个啊,这个红的设计。在对在PG table里面来。
11:00
好,我们看内核掩码注意啊。在这个。磨剂啊。A。下面的二米六四。Cloud。零克的里面是什么呢,ISM?S里面一个什么,一个memory看到没有。仙者,仙者的memory啊,双击。Memory双击之后,他们这两个的一个设计,你看啊,这是第一个是不是这几张下面用到这个memory还有一个什么,还有一个是b PG table。这个。这个里面。下面有一个看到没有,有一个什么呢?有个we medical start。和v m end。这两个是一个红,要注意啊,这两个红非常重要,其实它跟什么,跟我们这个。
12:00
Memory的地方是非常相似是吧?现在我们来看啊。嗯,它就这么个结构,你看。所以说。这个立方它就对,其实这个函数给你写出来啊。嗯,这两个这两个结果是吧。这两个结果所对应的这两个。它是属于这块,看到没有。Start end。啊,它的码设计。源码设计的架构是这样是不是?这它是什么呢?就刚我们讲了一个V。下划线什么。下划线这个start是不是。跟哪个呢?跟这个啊。
13:00
We。麦克。下划线有个什么end,它是什么?它是我们这个V函数啊。这个函数当中。函数当中这什么最重要的一个什么宏对不对。那么这个横,刚才我们看到了啊,里面有一个什么呢。有一个叫做你看models。下划线N是不是。他是什么意思?那么在设计的过程当中,这个we medical start。它是一个什么呢。它是我们这个V。Malo这个函数啊,就是这块区域了,它就是v malo这块区域,它的一个什么呢?开始地子。但是它是以什么是以内核模块这个区域的一个什么呢?结束地址作为标准啊,作为一个起始点。
14:00
那么他的这个起始点。接触地在哪地方呢?就是这个models是不是就这个地方啊。它这个为标准的就是M。啊,Models_一个什么end,它是以这个为标准。好,那么它这个为标准的话,在内核掩码里面,他在memory里面看啊。啊,这地方看没有。就这个。它的定义在这里。你要搞清楚这一点啊。好,那么这个问题啊,我们就搞定了是吧。好,那么现在我们解决这个问题之后是吧,那后面我们再进行进一步来研究啊。什么意思呢?就是相当刚刚我们所讲的这个函数看到没有啊,就这个你看啊,这个源码分析,我们可以针对它进行进一步来设计啊。
15:01
什么意思呢,你这个VM这个大啊。它的宏就是0XFF这个地址是不是按的就是FFF后面四个零是吧?那么整个VM,它的大小是可以达到什么?达到多少TB啊?那么可以自行自行进行进一步的计算。那么在设计的过程当中,在内和掩码它的一个分析有这么几个,你看啊,嗯,我们在memory里面,那我们就找到什么呀,我们所想要的这个啊,下划线。两个下划线呢,这一个什么呀。Lo。跑哪去了?We了,看啊。着急。找到它,你点这个函数,注意啊,点这个函数。点一下。点一下之后,我们会发现你看到没有size和那是不是这这这些相关操作啊。
16:04
那么分别是做什么?现在我们一个一个来研究。啊,针对这个内河野马啊。你这个分配内存来操作的时候是这样的,它总共你看一个两个三个四个五个六个,七个八个九个。总共是九个参数。啊,这九个参数都告诉我们了,你看第一个size,它内里面看。这个size是什么意思呢?就AOC这个size是什么。就是相当于你第一个参数,你这里面的第一个参数就相当于是什么呢?相当于我们这个v malo这个函数所分配的一个什么呢?内存大小。好,后面有个,你看它第二个参数,第二个参数是什么?就是对齐,嗯,内存对齐的一个要求操作。再往下面有一个什么,有个start。那么这个start,你看这vm l start啊,对应的是什么呢?对应就是V,嗯。
17:01
为了什么呢?We了区域的一个什么起始地址。看下面这个同样的道理了,就是we m啊,区域的一个什么结束地址,就这么简单啊,再往下面有个什么g FP mask。Gfp_mask就是刚刚我们提到了,它是一个什么呢?它是一个页面分配器的一个什么,分配的一个掩码非常重要,再往下面有个破车,看到没破破车啊。那这个per是什么意思呢?就是我们分配pro这个参数,就是你就是我们分配的一个什么呢?分配物理页面,分配这个物理页面。它所对应的一个什么,对应的一个内存属性啊。接着后面有一个什么呀,有个nod nod是什么?Nod就是这个标志了。就是V啊,MOC。啊,它这个区域啊,这个区域的一个什么标志位是不是啊不是我。
18:01
Vm flags啊,没错没错,就是它标志位。在后面有一个什么呢?后面这个nod看到没有这个no啊,还有一个啊。那这个node是代表什么呀?Node它这个参数。它就是我们所讲内存的一个什么节点。最后一个你看call address,它就是相当于一个什么,像那个调用者的一个返回地址操作。那么整体核心我们就全部给他讲完了,是不是就这就是你调那个函数来分配这个啊空间的时候它就会。传出总共以九个参数啊,就进来了。好九个参数进来之后呢,那现在我们首先来看第一个啊第一个。那么第一个是什么呢?你看啊,第一个你看它就往下执行,首先它定一个什么VML,这是什么,这是虚拟内存呢,就是虚拟内存的一个结构体。对不对啊。
19:00
然后所对应的一个指针,对嗯,比如ADR,这就到下面来了,到下面来之后呢,那接着这里面有一个什么,你看啊。你看size。那么S这里面一个什么?Page a leg进行进一步对齐,然后再进行判断。这是第一步啊。那么其实他为什么这么做呢?这样做的,这样做他就有这样做的理由啊,我们看一下是吧。这样做,他就有这样做的理由。就说我们针对这个这个地方啊,这个地方那么做什么呢。它是这样的。相当于什么?相当就是我们调用这个什么呢?系统这个v ma这个函数来分配什么,分配大小,它是要要以什么呢?要以页面,要以页面大小进行对齐。就是你执行这个地方是不是就直行掉了啊,要注意了。但是他有一个点什么问题呢,就是说。
20:02
如果这个V。麦克,它要求分配大小为十个字节,那怎么办?对不对,如果它分为十个字节,那么V它还还会分配一个页面。那么剩下什么,比如你四零啊。比如说4096是不是十个字节它就浪费了,是不是还是对就按照这个要求啊,你看你他这个分配过程当中,他这么回事,假设是吧。啊,假设啊。假设什么呢?假设你这个函数V。为M克这个函数是吧?啊,你分配什么呢?就是为假设VM,我们要分配什么?要分配大小为多少了?比如你要分配十个字节。你分配十个字节的话,那要注意啊,所以你这个,所以系统的系统操作的时候,它就会为什么呢?就为我们这个v ma这个函数。
21:00
还会什么,他不是给你分配十个字节。它还会分配一个什么,分配一个页面,是不是分配个页面,那么剩下的要注意啊,就是你剩下一个页面就是什么呢?就相当于两个,两个是不是那一个页面的话,就相当于啊四。1024乘四是不是就4096是吧,那就4096的话,你想4096减上十,那么现在就剩下什么,剩下这个44086是吧?嗯。4086。嗯,剩下4086这个字节。哎,它就造成一个什么呢,造成一个浪费是不是好,另外呢。另外要分配的这个内存大小,你不能什么不能为零啊,或者你不能什么不能大于这个系统啊。所有的内存。这就是说,为什么要通过这个size?Size就是分配内存大小,那么就有这个配机下划线,那这个进行来处理。
22:06
啊,它这个函数有这么多啊。好,那么这个处理完之后呢,接着什么,接着调用下面这来看没咱这来了啊,这就判断是不是下面就一个get vm l no。这个掉那个函数是不是啊,掉了个函数的话呢,其实再往下面它就确保什么。它确保我们当前不处于中断上下文切换。V这个函数呢,在分配过程当中,它可能会睡眠,就是说你进程在中段上下文当中睡眠不是一个非常好的一个啊操作是不是。这是一个,还有一个什么,还有一个就是我们要确保什么啊,你要确保当前这个中断啊。这个问题。还有一个就是说再往下执行,它就有一个什么。他就执行这个v l nod是不是啊,再往下面清除执行。它整个函数的一个核心点对不对,但是我们在分配的过程当中有任何问题啊,它就会输出一句话,可能有we like,分配失败,那么多少个字节是不是它就全部给我打出来。
23:12
整体思路啊,我们全部都解决了。好解决之后,那现在我们就来看下一个问题啊,我将这个复制过来。嗯,我们把它换掉了啊。这个我就研究OK了,是不是。好,那这个我们研究OK之后,接着我们就来看下一个是不是。下一个就是说我们在设计的时候,它怎么进行调用,是不是啊。我通过的图形啊,就是我们。我们现在是不是通过什么呢。通过这个。啊,通过视图。我们通过视图来表示什么呢?表示视图。来表示。
24:00
V mlo。他的一个什么,分配的一个什么呀。分配的流程啊。啊,我们来看一下。那么他这个分配流程是怎么做,是不是大家不要着急啊。嗯,因为我们在应用层用过,但是你要研究这个底层呢,肯定还是需要这个,嗯。过程是吧,那首先看第一个。第一个刚才我们讲了啊,嗯。刚才我们已经研究研究差不多了,是不是。已经讲解差不多了,你看第一个啊。大小。大小设为23。首先我们看到这个内核掩码,它执行哪一个呢?Ranch。就调用这个函数啊。看一下C第一步。啊V首先第一步要调用的。首先。它调用这个对不对,才能调用它啊。
25:03
调用它之后,那么一旦执行这个函数之后,它就会从哪里,就从我们这个啊,上一次我们在研究查找这个红黑素上是不是看一下进行进一步的分配。所以说他他就从哪里来。就从这个地方开始了是吧。从什么呢?从我们上一次。查找这个什么呢?红黑素的一个结果,是不是专门有个什么一个叫做嗯。专门有个啊。什么呢?下划线,V map。里面有一个什么呢,Catch啊。到这个函函数当中进行什么?当到这个函数当中进行尝试操作,是不是就这么个意思啊,尝试。啊,那么尝试成功与失败,那具体你要看这个问题啊,并不是说你尝试就一定要成功,是不是啊。
26:00
你不尝试肯定是失败,尝试的话还还有可能会成功,是不是啊,不尝试肯定失败就往下走了。说明在操作过程中,就是说如果我们从上一次啊。如果是,那就会找到这个VML,它的一个大小。那如果不是,那那就找不到不是,就从整个,如果你不是,那就从这个病历开始了。注意啊。嗯。是这么这么一个回事啊,如果不是。否是吧。否的话。否,就必须从这执行开始,你看如果是否,那么就又从从头开始。否就从头开始。就是从头开始,那就就从头开始,就有一个什么,就刚才讲了V。Malo。下划线有一个什么呢。这个start看没有啊。
27:02
开始什么开始便利?病例搜索。就这么个意思。从这地方开始。啊,便利搜索。那么你这个地方你就这样走了,这个是否啊。就是失败层数,这个是否是吧。哎,那么如果是会怎么样?是就会找到适合的东西了。哎,如果是。哎,这个是四啊。是,那我们就查找什么呢,查找合适大小的一个什么。大小的一个页面嘛,就是V。Map下划线,什么arrow?就执行那个。那么执行到这个函数之后,到接着什么,接着就你要讲什么啊。你要通过一个函数插入到红黑数当中。嗯,它那个处理过程就是这样的。1800啊。
28:05
接着就往下走。往下走通过什么呢?通过这个。下划线这个。Insert。V里面什么呢?An arrow。这个是实现什么,实现插入这个红黑素。啊,这个操作,然后再分配这个什么物理页面。你擦红霉素就分配物理页面了啊。放上去一点啊。接着。下一个。下一个做什么呢?下一个就是说我们要要分配什么,分配物理的一个什么。页面分配物理页面就直接通过这个了,Lock下划线配齐这个函数去处理。
29:00
那么还有什么呢?还有虚拟地址和物理地址之间,你要建立映射,否则就不行。啊,它整个过程就是这样的了。再往下面走啊。就落到这儿来了。接着我们再往下。你在分配物理的时候,它怎么做呢?分物理很简单了,你处理完之后就通过这个map啊,Map_VM里面什么L这个函数去处理。但是我们为什么现在你是为这个微map arrow是不是这个什么,它对应的一个虚拟地址和什么呢?和物理地子啊。物理啊,就是物理页面了,物理页面直接什么,直接进行创建一个什么,创建一个映射操作。就这么一个过程。啊,所以他就从这边移到这儿来。它的过程就出来了啊啊,你创建完之后,最后什么创建完之后你要返回这个地址呢,你不返回这个地址就没法搞了,是不是。
30:05
啊,所以这最后你要返回啊。最后我们要返回这个啊起始地址。你返回清式例子通过什么v mapmp里面有个什么呢?A。它的整体流程我们全部解决。全部搞定了啊。啊,这就是的一个分配的一个流程啊,啊各位朋友啊,如果大家是后面来的,没有跟上前面我所讲的没有关系是吧?嗯,大家可以什么可以找贝贝老师啊来领取今天晚上那个。视频笔记是不是还包括往期的一些相关资料啊?那么现在的话,我们首先就把这个标注一下啊。标注主要是方便我们在阅读过程当中就是好看一些是不是?看的什么,看的没有眼?眼就是眼睛,没有什么。
31:03
没有疲劳啊。看一下颜色是不是。再往下走。再往这边。这个可能有点小是吧。就这么干啊?就这过程。但是。但是这个是不是这个操作过程中,他找到什么,找到适合的E,它就直接从A。对呀,是吧。他这个叶要从哪里,从这到这来。他就这么一个流程啊。整体思路啊,各位朋友啊,整体思路我们就全部给整好了是不是。好,那这个思路整理好之后,我现在就将这个什么。将这个笔记放到这来啊。等下大家直接。找贝贝老师要就行了,是吧,我就把这个。
32:00
体的下面来啊。OK。就这么个流程。画好了啊。啊,这是。这个通过视图来表示we Mac的一个流程,但是你具体你怎么去操作,你可以看这个呢,我们看这个掩码看没有。嗯,你把下面一个调用一个什么get是不是返回啊,是不是no,一步一步往后面执行嘛,你根据这个函数进行往里面操作就可以了啊。往里面递柜就行了。嗯,一个页面。内存页面是不是,那你要看它到底是多少位,要搞清楚明白不。一个页面我们60注意啊,一个页面的话呢,大小我们是多少。
33:01
是4KB。加4KB默认啊默认。嗯,小谢这位同志啊,就是。Linux内核啊。就是Linux这个什么内存,它一页是不是。一的话,我们默认值默认为啊,就是4KB。默认是4KB是不是,嗯。但是啊,要搞清楚。这里提到又又出了一个问题啊,就什么意思呢?就是利纳克斯。它同时支持什么呢?同时支持这个正常大小的内存页。差那么大内存页,就是其实它有两个点,这个你从这个点去出发。你看啊,我们在分配内存页,它是这么分配啊,你看啊。你这地方开始是吧,嗯。就是什么呢?就是linu克斯对不对,他同克斯这个啊。同时对不对,它支持什么,支持正常的一个大小,那么一个是什么内存页,是不是还有就什么,还有是大内存页了。
34:09
报内存也就这个了,就是后面会讲啊hug后。Page。那就这个。但是绝大多数啊,大多数的这个什么,大多数这个啊,处理器的内存页就是大多数这个处理器的。内存页,嗯。就是默认的啊,这里我所讲是默认啊,就是默认大小。为什么呢?目大小为4KB,对不对啊?4KB2。虽然啊,虽然有有部分的这个处理器,它会使用什么,有的地方使用8KB16KB64是不是,但是4KB的页面。仍然是我们操作系统默认啊,默认这个页面配置的主流的核心点。
35:00
就除了正常这个页面大小之外,是不是就不同处理器它包含不同大小的页面,所以还有一个问题啊。可能大家还没注意。所以说什么问题呢,就是我们经常讲的一个什么叉八六是不是哎。叉八六这个处理器。对不对。处理器啊,它可以什么呢。它可以使用多少,使用两兆,两兆的一个内存页。他就这么个思路是不是?那么一般我们讲这个4KB是历史啊,历史遗留过来的,是不是一直保存到现在,为什么呢?虽然现在啊,虽然现在我们对计算机的硬件啊,提升的非常快,是不是,所以一般都不考虑这个问题啊,这一般不考虑。所以说这个随机存储这个内存,所以4KB内存的大小。他不是最佳的选择,但是默认是4KB啊。
36:01
就是说什么意思呢?就是说8K或者16K,它也不也不一定说你8K16K它是更好,64它是最好,是不是只是在这个环境做一个权衡操作。就这么个意思啊。啊,来存储分配是不是。好,那现在我们就来看啊下一个问题了是吧。好,下一个问题我们就要研究,这是刚才讲的是第一个啊,V mlo就出来了。啊,要第三个了,下面看第三个啊第三个。第三个是什么呢?就是lo。这个我们经常用了,是不是啊,Ma函数的一个什么分析。什么意思呢?就是当我们这个程序员啊,使用这个函数对不对,麦函数它是什么。它是我们C程序当中,对不对啊。啊,这个C程序当中的一个什么呢?内存分配函数啊。但是说。假设啊,假设你有两个进程啊。
37:01
AB2个进程。那你通过两个函数啊。来分配这个内存是不是。但是麦克这个函数。它是C眼标准封装的一个核心点,所以说最终结果啊,最终结果是什么意思,就是说你它是怎么用的,大家注意啊,怎么用啊,你要挖掘是吧,挖掘可以,那肯定可以挖掘啊,好,那你看啊。你足够大你就没问题嘛,啊,你看这边什么意思呢。就是说我们提到的这个,我们从C语言啊入门的时候,我们就讲过了什么。就函数它是什么,是C标准库进行封装的。C标准库封装的一个什么核心架构对不对?但是说。他会做什么呢,就是。C标点库它会做一些处理,是不是就是相当于什么,相当于它会调用调用什么,调用Linux的一个什么系统调用接口有个BRK,就这么一个意思。有,大家可能就不熟悉这个BK了。
38:02
他BK什么,BK就说我们不熟悉,BK就说原因在于什么。我们只用前面嘛,是不是我们就不管,一般我们做应用就不管你这个BRK到底是什么东西,跟我没有关系是不是,但是BRK它这个系统调用接口是不是。很少有人知道,那是因为什么呢?会直接使用系统调用通过它什么。其实这个地方。他就是像什么呢?就是直接向系统啊申请这个内存对不对,嗯。而且总是使用麦之内的一个标准库函数了,所以说啊BK是不是如果按照按照这个案例来讲的话。你看啊,像这个麦克函数,它就相当于什么呢?就相当于我们这个零售商,那么这个BK的代理商。就这个意思。就是说malo函数,它是它为我们用户啊。这个进程啊,维持一个本地小仓库,就这个意思。
39:01
但是当进程需要更多,当进程需要更多内存的时候,它就会向这个小仓库啊要货,是不是那么当小仓库不足的情况下,他才会跑到后面这个什么BRK。所以啊,我我我举这个案例,就这个意思,就像什么,相当于我们生活案例当中卖了克函数是吧啊。他就啊,好比什么呢。好比这个零售。啊,零售商是不是啊。那么这个BRT是不是啊。它就是好比。这个代理商就这个意思,是不是,就是一般情况下,你调这个函数的时候,是不是他就基本上能够满足我们啊,普通的一个进程维护,专门做一个本就是相当一个本地的一个小仓库一样,是不是?那么进程需要,如果进程需要更多内存的时候呢,他就像那个小仓库的一个代理商,是不是要货就可以了,是不是,那当这个小仓库,是不是当小仓库这个内存不足的时候。
40:05
他就通过什么,通过代理商这个BRK是不是像内核批发这个内存。就这个意思啊思路,那么机体这个BRK啊,内核野码分析在哪个地方呢。好,那现在我们进行啊,进一步的研究。OK啊。各位朋友算。就到这儿来了啊。是第二个是。看不清楚啊,刚才有个有个朋友说看不清楚是吧。啊,现在可以了啊。嗯,差不多了是吧。好差不多之后呢,那我们找到这个源码里面啊。也么你找那事你要找MM要注意啊,你是内存管理嘛。找到这个MMMM下面一个什么呀,I map。M map。M。
41:04
啊,这个map.c好,除了。好慢铺点C下面是不是就就就可以找到我们要的啊。他专门有一个什么。森一个。系统调用是吧。系统。这种康FSS。SS下划线点就就找到了。就这个了。看到没有?你看BRKBRK就掉了个函数是不是。不就出来了。这个函数它有很多个,你不止这一个啊,你要搞清楚是不是系统调用的这个定义是通过什么,通过这个SS括DL1这个宏来实现的,是不是。但是他具体操作,它可以有一些相关的头文件啊。让我们进行什么呢?进行去完成。啊,这点我们这点的话,我们就不需要操心了,是不是。
42:00
不恰不需要操心这些相关的问题。那么BRK的话,比如它有R64啊,有各种各样的R。就这个了。你需要向内核里面申请,就通过这个来啊。有这么一个函数,看到没?通过这个函数实现。好。那么它也可以什么呢?它也可以进行进一步的展开。进一步的去实现。虽说。你看你点这里啊,你看比如它这么一个函数是吧。它那个函数你进去之后是不是在设计过程当中。B2K是不是里面的参数相关进行进一步操作,所以后面就出现什么呢?在出现调用过程,它有M64是不是。
43:02
也许你不上69 32位。啊,它也会出现这一块,你看你在哪里找啊。我们在什么呢?在刚刚我们看到的。你看你在a ch里面。一般我们以这个为准啊,这个方便是吧。Include ISM。下面这个括。SYS。SYS库看没这个。啊,双击这个。这很多,我看到没有。一路繁华来笑啊,哎,魔教大佬,是不是大家都一样啊?好,那现在我们看这地方。那这里面有哪些呢?你看啊,你看第一个是吧。对的,你看。Compel ss括def file123456是吧,但是这里面有什么,你看264有个comp对应的名称嘛,这个井号看到没有。
44:02
就通过这个来联系嘛。后面有很多,你发现没有。你看M64SOS里面有个什么,这两个name是不是从之后你看。那这点VS你这个名字写什么就是什么嘛。对不对啊,代替这一块啊,你看。一直什么呢,一直走到下面这个do ss啊。这这都是什么,都是BK的实例嘛,所以我们在放的时候你看。他怎么去放呢?你看这个SSBRK。你看F,你看啊,我看见F。那么CTRLF的话,那比如我们下划线。等一下啊,嗯,我两个下划线,那么下划线什么do_SSOS不就出来了,是不是SS下划线。后面它就可以什么呢?就跟着你这个下划线有个BRK是不是啊BRK啊系统调用缩写是不是。那这就是我们现在大家所看到的这个部分。
45:02
我把他移到这儿来。很多是吧。好,那这个就搞定了是吧,好,那么这个搞定之后,那么接着我们就来看后面。后面的话我们还知道什么,就是我们作为一个。工程师是不是那么最基本的话有一个问题什么呢?就是说根据刚才所学的,那我们必须要知道,接下来就必须知道什么呢。必须知道下面第四个问题。第四个问题是什么?第四个问题就是用户态的一个地址空间的一个什么呢布局。布局怎么布局?但是要知道啊,就是比如说我们在什么呢?你在32位的,你在32位Linux内核当中,对不对,就是你每一个进每一个用户进程。每个用户进程它拥有什么?拥有3GB的一个什么呢?
46:01
用户它的一个虚拟空间是不是,而且如果我们在什么呢?而且我们在64位就不一样了,你在64位的Linux内核当中。当中对不对,就是每个进程。嗯,它可以什么呢?可以拥有多少,拥有256T。256TB的一个什么呢?TB的一个用户态。虚拟空间。这两个是不一样的啊。那你32位只有三个疾病吗?还有一级,毕竟还有一级这个内核啊。啊,这个也是要要要根据这个来的,是不是所以说。这些虚拟空间。他们是如何进行划分?这个问题我们大家啊,一定要搞清楚,是不是这是一个点。就是基础课程。等一下给你回答啊。
47:16
好,那现在我们来看啊。就是这个。啊,用户态的一个什么空间的一个布局。那么这个。用户就是用户进程的一个什么可执行文件,一般我们是这样的。啊,用户进程。用户进程的可执行文件。它是有什么,它是有,比如有这个什么数据档。和什么呢,和这个代码段。进行组成的。所以说我们这个数据蛋。它又包括什么,包括所有的一个什么,静态分配的一个什么。数据空间是不是,那数据空间有哪些啊,你比如什么全集变量啊,什么静态局变量是不是,但是在在执行文件装载的时候,内核空间就为它分配好了。
48:07
它包括这个虚拟地址和物理页面。所以他们之间就可以建立一个关系,是不是可以建立关系啊,那么机体是不是啊,大家注意啊。就是他的一个具体操作。怎么去完成是吧。集体。机体的什么机体,我们这个二米六四这个架构,它架构啊。嗯,架构它那个什么。它这个啊,就是处理器了,这个处理器架构。它进程地址空间的一个什么呀,布局。如下啊,我们来看一下。哪一些呢?我画一个图形,大家注意一下啊。一般我们要描述这个图形呢,是这这么做的啊。256是内核空间,用户空间,256G完全足够了,是不是还有一些什么非规范区域啊,不能用的是不是?
49:13
这一款是不是。这个啊。再往后面。再给你来一个。大小填充颜色更改一下啊。是非规范区,是不是就是非规范区不能用啊?然后再还有什么,还有一些相关的一个什么用户账啊。
50:11
还有一个是用户账。还有什么爱啊,等等啊。啊,应付账。用户脏水,用户空间啊。用户站。啊,用户站下面再给你来一个。就是I map嘛,空间嘛。这个是I map。空间在这里。还有堆空间是吧。除了I map空间,你还一个是。堆的空间。再画一个D空间啊。多余的空间。好堆空间再往后面啊,我再画几个就不再画了啊。
51:05
看一下C。他有哪些呢,对。不要这么多啊,这么多够了,比如说除了堆空间。还有对应的一个什么,比如我们所讲的一个数据档。数据单。除了数据端,还有代码端。代码,当然还有相关对应的一个什么。啊,没有经常使用的啊。我们叫做什么叫做保留区,是不是啊保留区。好,那现在的话,这些保留期我们一旦搞定之后,是不是,哎,下一步你要做的是什么呢。下一步就说你要把它分归纳起来是不是。啊,你没有把它归纳起来的话,你就不知道他怎么回事。就是它的布局是怎么样的是吧。我把这个列出来啊。
52:02
来看一下是吧。嗯,那部分就出来了。我们怎么去分是不是。那我通过这个发括号是不是。最上面这个位置啊。这上面我们是阿米六四架构,你是阿米六四,我们是阿米六四架构。M64架构,那么这个地方必定是刚才我们讲了一个什么呢?内核空间,内核空间就是256TB,是不是啊,这是看完全足够了,非常大是吧。啊,这是这个还有什呢,除此以外,下面这个部分是非规范区域。嗯,这是不规范的区域啊,要注意啊。哎,这地方是。非规范区,嗯。那么非规范区再往下面就是我们所讲的用户空间,到这来。用户空间就往下走了。用户空间。
53:05
看到这来应付空间啊。用户空间它也是256TB,但是机体里面哪一个从哪一方开始,比如你这个刚才那BK是不是啊,比如什么v map是不是,它怎么用啊。最上面这一块地址。最上面这一块。等一下啊,这这地方不对是吧。嗯,这上面啊。好,最上面这个地方。他的地址是什么?就是零是吧,X多少。相当于16个F1234是吧。1234。
54:01
1234。啊,三四你看最大的。就从地方开始了。20。看到没有?然后呢,内核空间是不是从这地方开始。对不对,从地方到这儿来,它那个起始立方。那怎么分呢?就零,XFFF后面有多少?有12个零。三个0123,诶。1234是吧。他就这么分了啊。好这样分好之后呢,再往下面,那中间这一块是不是中间这一块啊,下面这一块,比如嗯,你从这个什么就是。非规范。其一。那你不规范区域的这一块。
55:03
要搞清楚你不规范这个区域。那么非规范区域那就是不能用,不能用的话再往下面就是应付账了。那么从用户站这个地址开始看到没有。咽火在这第一次开始啊,从这地方开始。它相当于什么呢?相当于其实它就这个这个结局。这个算了。他们用这个啊。他是零零开始的。几个连四个零。哎,是由这个乘除开始。那么从这个什么呢?我们从这个用户账对不对啊,到什么呢,到往下这一部分,它专门有一些相关指针进行执行。并成这个制定。我只想这来是吧。走到这儿来。
56:00
那么下面这个部分。就是我们所讲的一个什么a map。I map的一个什么,Map的一个空间,看到没有?空间。空间,那你这个箭头就朝下了。你map空间。你这个箭头。你刚好顶到这个位置。这根线啊,刚点到这根线。然后接着下面呢。堆在这里,看到没有,堆在这个位置。啊,所以他在设计的时候,是不是那么下面就有一个什么呢。有个I map。嗯,专门有个M。曼普下划线,拜这个成员。啊,就刚好接到这来。刚接的这个部分。那么他接到部分之后呢。堆空间是往上走,所以它专门有一个什么,有个BRK等等一下啊。
57:19
BK在这里。向上增长啊B可以第二这个。哎,四大车BK就在这个,就在什么,就在数据段这个地方。Start。下换行BRK。嗯,它两者的关系。一直顶到这个MBA这了啊。就这么一回事。好,接着什么,接着就说下面是0X0000开始了啊,这里就不再多列了,是不是。
58:02
下面这里。从这个用户账到下面这一部分。啊,到下面这个什么,到下面这个堆空间之间,它都是堆空间,要搞清楚啊a map它也是堆空间是不是。啊,你对空间本身用户站也在对空间范围内,说明在设计时候它就有这么一个流程,你看啊。从这地方开始是吧。哎,一直到下面这来。诶。
59:03
拉下来一点啊。好,从这边。所以在这这个不好表示是吧。的往下走,你看。玩笑是不是?来搞大一点。应该差不多了是吧。再接到这个地方来。这边。往下挪。好,没问题了是吧。啊,这规划们全部做好了啊。这就是什么呢?这就是264进程的一个地址空间。啊,就这样划分,但是具体是多少是不是,那我们在设计过程就说。
60:02
它这个指定虚拟电子空间的顶部是不是顶部是向下延伸,所以BK它一个end date到什么用户那个顶部,它就这么一个思路。这个过程啊。啊,大家来看一下算。嗯,这个部分我们前面叫做堆。空间是吧。那么这个箭头两边箭头了。就这么个思路,两边箭头啊。再从地方到这儿来。算了,就不画了啊,反正你知道。这一块,这一块都称为什么呢。堆空间就可以了。好,那么现在我们了解啊。了解这个堆空间之后是不是,那现在我们就看下一个问题了,是不是。那下个问题的话,就针对这个部分进行进一步的分析是吧。要注意啊,嗯。
61:02
OK。断叶式啊,注意啊。你要注意这一点什么意思?蛋液是呢,它它这个结构是这样,是不是蛋液是这个管理系统的一个最基本原理,实际上就说。首先他先讲什么呢?先将用户程序啊。分成很多很多个段。再把每个蛋分成很多若干个页。啊,并且每一个段就附一个断名,是不是就这么意思呢?就说你在什么,就是我们在蛋液式系统当中,就说那么它这个地子结构有段号啊,啊大内叶号啊,或者是业内的地子啊,三个部分组成,就是你这个小周的这这这位这位这位啊这位朋友是吧,你所提出这个问题的。你有时间你可以研究一下,是不是研究进行进一步研究啊。啊,这个我们就我。
62:01
就给大家发好了啊。OK。好,那现在我们接着啊。来看这个问题。就针对这些信息啊,我们进行进一步的划分,是不是一步一步往下走,这样的话你就了解的更多是吧。那现在我们就来看下一个啊。下一个。下一个是什么呢?刚刚所提到的啊,比如我们这个BRK是吧,你BRK分配的一个空间是从什么呢?是从这个数据段的一个顶部,对不对,就是N的数据段的接触啊,N的代啊。End date是什么意思呢?哎,这个,嗯,行星啊,等一下啊,等一下啊这个。BK分配是从数据段顶部这个n date啊到什么呢?到我们用户站的一个底部,它的思路是这样,就是说我们所有什么呢。就是我们所有的这个动态分配空间,它是从进程的一个什么,从进程那个N数据档。
63:04
结束这个地方,开始就是你每一次。每一次分配一块什么,一块空间对不对。但是他就是把什么,就是把这个。这个边界。把这个边界地址往上面。进行进一步的什么呢?推进一个段往上面推啊。往上面推进一段,就这个意思,同时啊,同时内核和这个进程呢,它都会什么呢,都会记录我们这个什么。当前的一个边界地址。就这么干,所以说我们在掩码里面,它装了一个task,什么task下划线,它有个size是不是。哎,它是扇子这个大小,它给我们处理器架构。跟这个处理器架构,它所支持的一个什么呢?最大虚拟地址。
64:01
最大虚拟地址的一个位宽。位宽有关诶。尾款啊,诶。嗯,位宽有关,那么一般我们是以什么,以48位,是不是48位的那个什么位宽。四八位位宽的话,它它是怎么设计呢。它就在这个地方,你看啊,42位宽。机体,你要查看什么?查看内核的野马啊?那你查看你从这地方开始啊。他这么做的是吧。找到地面来是吧。那这里面有一个什么呀。A r ch。下面有个什么R64是吧。Include asm里面什么呢?PLCSS。是吧,这个。
65:00
里面你看这。他是个size size啊,就就就这一方看到没有。如果是32有32的话,就32嘛。你不是32G不就64嘛,对吧。在60这地方。看到没有,60字要大一些。这这个结果就出来了,你看啊。我们这个地方。他是个塞。他SIZE64。还有一个task size,你看64,你就是64,你不是64,你就是32。是不是30不是从离婚开始吗?那就是0X1,后面几个零呢?34567是吧,七八个。好,那现在我们就从这个地方。你看那个结构啊,会看那个结构就可以了。
66:01
一个是。68行,这地方。64是吧。啊,你30锁定这个部分。看到没有。这地方是个。恒定进行判断嘛,你到底30还是64是不是。啊,在这个位置。好,那现在啊,这个我们就解决了是不是。
67:16
好,这个行星的这位,呃,这位同志是吧。GDT和ldt指的是什么?哈,提这个问题啊,你要注意啊,这个问题是这么这么一回事是吧。啊,既然我看到了,就给大家打一下是吧。我们所讲的跟跟什么呢?跟刚才这位朋友这个蛋叶是就是断这个地方它有一定的关系,是不是。那么什么意思呢?就是分担机制,就是在操作系统里面啊。再从系统里面的话呢。它这个分担机制跟我们这个GDT,跟那个ldt它有一定的关系。
68:03
怎么回事?啊,那现在我们进行进一步观察,比如断了,比如CPU里面。CPU里面它有什么呢?有这个液的部件和断了部件嘛,是不是,所以说一般情况下,你比如这个32位的保护模式,它每个任务都有四个GB的虚拟地址空间。它就像一个什,就像一段平啊,就像当什么平直的一个线段,就是我们叫什么棒这一块是不是线性地子嘛。但是这个段它就不一样了,段。他是石先生呢?断,它是实现这个弟子。实现虚拟地址。现行地址转换的一个机制的一个啊基础。那么在保护模式下,这个锻炼比。了断机子。断限制的长度是不是还有一个什么,还有一个就是断了一个什么,断了属性。
69:00
对不对,所以它再往下面翻。那你再往下面分的话呢,那么接着什么呢?接着你当有一些相关限制,但限制一般是20位表示不就足够了吗?是不是20表示的话,你当当的界限,那么自节就相当于什么呢?以4KB啊,刚才讲了4KB为单位了,你从零开始递增是不是就可以了啊?还有就是呢,还就跟我们提到了。啊,还有就是你提到这个问题了啊。什么意思呢?就是它有一个什么,有个段对不对,就是有一种就是断描述,断描述符这个表。它和蛋的一个什么有八个直接有定的关系。就是你这个。他在操作过程当中,每个段它都有一个描述符。它是为了存放这些描述符,需要在内存当中给他开辟出一段空间。那么这段空间。里面所有的描述符都把它堆到一块。
70:00
集中放到一起。这样的话就构成一个描述浮表,对不对?那么描述表的长度它可以发生变化,就说你最多可以包含8KB,这个描述浮表是不是?为什么呢?因为断了选择它是16位啊,比如还有13位作为index使用嘛。所以后面它有什么有两种啊,就是相当于什么,相当于两种的这个描述符表哪两种啊。就是你提到了这个小周的这这这位大佬这位朋友啊,就是嗯,就不是行星,而是行星,就是说讲什么是讲那个GDT和什么呢,和ldt就就是你提到这个问题了。啊,这问题就出来了是不是。那么它这个结构是不是。那么ldt啊跟我们啊当中提到什么呢?GDT其实差不多是不是比如我们这个啊,区别在于什么呢?在于全集。在拳击和局部操作。就是说ldt这个表它是存放在什么呢?存放在ldt类型段中间。
71:05
那所以说你GDT,它必须包含ldt的一个什么断描束缚。就是ldt,它本身就是个段。是不是啊,GDP不是你要搞清楚啊。GDT它不是不是段ldt它本身是一个段。就说我们在ldt这个段当中啊,就是它的线性体征中这个GD值,你我们就需要借助什么,需要借助这个GDGDTR。查找LGT相应的地址。所以说。需要什么呢?需要的是GDT的那个断苗舒服。才能够解决问题,否则解决不了。他就这么个意思。所以它的描述方式啊,区别在于全集合局部这一块,所以说后面我们就给它总结计划是不是就是LLDT。它本身啊是一个什么,本身是一个段是不是,但是S什么GDT。
72:05
它不是是不是,那么比如我们查找什么,你查找GDT。啊,在什么呢?在现行这个在线行地址当中的一个什么。基地子是不是,那这时候就需要什么。鸡。寄地址诶。啊,吉地子啊。嗯,需要什么,我们就需要借助什么,需要借助这个GDTR对不对。GTR,然后什么呢?而且我们在,而且你在这个。而且你再查找啊,再查找ldt这个什么相应的一个ldt。哎,相应的一个。啊,GD子它就需要什么呢,需要的是GDT。当中的一个什么呢?段的一个描述,大家可以,其实如果你真正要去研究这两个的话。
73:04
一下子可能摸不清楚啊。如果你要去研究。建议啊。建议大家。看一下什么呢?看一下操作系统里面的一个什么。师模式。和什么呢,和保护模式。里面就会提到。你把这个干一下就可以了。把这个研究去就可以了。那么对于操作系统来讲。每个系统必须有一个GDT。为什么用它?他就是系统当中所有任务啊。和这个程序嘛,是不是啊,就这么个意思,你要搞清楚啊,就是相当于什么呢?相当对于什么呢?对于这个操作系统。对操作系统来讲,每一个系统它必须要定一个什么,定一个GDT是吧,但是用用它干什么呢?用于系统当中的什么呢?所有的这个任务啊。
74:06
所有任务和程序。那也可以什么呢?我们可以选择性的定啊。定义什么呢?很多个的这个什么ldt是不是刚才讲了啊。L,呃,就GDT它本身是一个段,而且线性地址空间的一个数据结构,那么GDT的一个什么呢?线性G地址和长度,它必须加载到GTTR里面去。所以说因为每个因为每个描述出的长度是八个嘛,所以GDC的这个基地值啊,最好跟八个字节进行对齐。这个就是跟就是为什么,如果如果各位朋友啊,就说如果为什么你听这个比较模糊,或者概念搞不清,那大家建议大家研究一下超系统啊,这跟超系统有关系是不是。你如果你再研究的话,比如端选择幅,像刚才讲那个端浅择幅是什么呢?就是是是比较复杂啊,是比较复杂,小谢这位朋友啊,就说比如我们实是就是你实模式下这个比如六个六个断气存器,你要你要把它搞清楚,比如CSDSSSGSS。
75:13
就这一些就是在保护模式下,它叫做端选择期。那么实时模式它不同了,就是你保护模式的内存访问,它有它自己的方式,但是在保护模式下滑,尽管我们访问内存啊。内存的时候也需要指定一个段,是不是?那么把它传送到什么呢?传送段选择性内容,它不是逻辑地址,而是段描述符的一个什么描述符表当中的一个索引号。所以在保护模式下,你访问一个访问一个端的时候,那么传送到端选择器的时候,这个端选择符。比如说我们选择什么呢?选择这个。操作。比如。我刚讲了,刚刚提到是不是。所以说它有什么,有16位的是不是啊。等等啊,这这这个我们就不再扯了,可能越扯就越远了,是不是。
76:04
就这个问题啊。好,那接着的话,我们就就回到我们的课堂里面来啊,回到课堂里面来。那我们回到课堂里面来的话,我们就再往后面看一下啊。那怎么做呢?我们观察一下啊。在哪里呢?在这个a map.c看到没有啊。在。MC里面呢,我们就有一个叫做。哎,Do sys这个BK你看啊,看见F了。Do下滑SS。I map_SM。对没错,你看没有BRK是吧,第下面你看它指着立方啊。
77:00
就是MM所指向MFSEC是不是他做什么呢?就是申请学者类型的一个什么读写信号量这一部分的操作。因为什么?因为后面你要修改进程的地址空间,所以你必须这么做。所以到这里的时候,我们就执行了,我们选择什么,我们要选择这个内存描述符里面有一个BK这个成员。那么这个成也是专门记录什么,专门记录这个啊。动态分配区的一个什么,当前底部。那它也有什么呢?进程,进程的内存描述里面也有个start br k了,用来记录动态的一个起始例子,它在哪个地方啊?在这里面来了。Z。在这个include Linux上面呢。MM消息。
78:04
双击是吧。刚才你找到那个啊,CTRLF有一个叫做叫做什么。才知道。在比亚克。B k start b k就可以找到它了啊,Start。这个卡美眼,你这个我上次给抢过了,看到没有。你看。这里一个什么大RK和BRK嘛,就代表什么呢,代表对的一个什么,对的起始地址保存在这个地方是不是。BK表示当前区的一个解除地址呢?是这么个意思是吧。啊,这就解决了啊。哎,那这些问题解决之后,你比如我们如何,我们通过什么find相关的函数来查找一些相关的这个地址。啊,就是我们对那个麦这个函数的一个调用是不是。但是我们必须要了解一个问题,这个BK。Linux内核啊,这个BK系统调用这个流程怎么执行。好,我们来看一下这个架构啊,大家注意一下啊。
79:03
跑到这儿来了是吧。没关系是吧。这是刚才这个第四个是吧,下面看第五个。第五个啊。第五个是什么呢?第五个。就是。哈达内核是吧。这个什么BRK系统调用的一个。流程视图。来看一下啊。我发一个图形啊。它怎么去调用呢。大家注意。嗯,首先第一步是吧。首先第一步啊,一步一步来嘛。
80:02
首先,第一步。第一步做什么呢?第一步就通过是吧。通过BRT这个。系统调用。请求什么呢?请求新的一个边界,这个BRK,这是第一步是吧。好第二步他就执行什么,就直接调用系统里面了,就调用刚才来录入下面了。会调用。调用什么呢?调用下划线这个度里面的SYS有个什么BK。就自行的障碍是吧。下步了是吧。啊,这第二步啊。第三部是吧。啊,第三步他就走上来了。啊,第三步。如果。如果什么呢?如果我们这个BRK它小于什么小于MM这个指针所指向的BRK怎么办呢?就说明什么,说明进程请求。
81:07
说明进程这个请求。释放这个空间是不是再调用什么,调用这个路下划线nu map。他就这么一个思路啊,你看就出来了是不是。这是我们第三步是吧。啊,第四步的话呢,就叫什么插入黄黑素了是吧。啊,第四步就走掉了了。第四步。第四步就调用。调用什么呢?调用这个insert。下划线这个什么v map里面的。插入到什么呢?插入到这个红黑素当中。嗯,他就这么一个流程的是吧。就这么走过来啊。好,那么走过来之后接着什么,接着你要检查了对不对,你要检查边界BRT是否有现成的虚拟内存区嘛,有直接干是不是。
82:08
啊,接下来。那我们就检查检查新边界的一个什么b k two。啊,是否有什么呢,有现成的一个什么。有现成啊。一。现成的一个什么W啊,就是v mi虚拟内存区。看他有没有是不是。然后。再到这边来是不是。好到这了之后你看啊,到这一块的话,他做什么呢。那么你检查这个边界,就再通过通过这个API函数是吧。通过get下划线。这个U啊。
83:00
On map。下划线这个arrow。干什么呢?查找一个可以使用的一个什么。使用的一个线性地址啊。它的一个区间是不是就这么一个流程。啊,信息地址信流程之后再进行合,如果有的话就可以合并啊。有的话我们就往下走了,就通过这个。通过啊。通过什么呢?通过v mi里面这个。Mo。进行什么检查?是否可以和现有的啊。这个vma进行。进一步的合并。就这个意思。然后你合并是不是合并之后呢,比如说新的一个产生呢,是不是。
84:03
这么一个思路。就这个啊。好,就到这儿来。当然就是新的什么呢,你直接现在我们创建一个什么。创建一个wma。并且要填充什么呢?填充VI mi就可以了。然后再把它添加到红黑素里面去了。它也是这么个流程啊。它也并不是我们想象中很复杂。我们再往下走,看到没?下面就通过什么呢,通过一个啊。函数。这个link是不是干什么呢,直接把什么把这个vma添加到这个进程呢。红黑素当中是不是。然后再返回这个地址。
85:06
走到这儿来。最后返回。啊,虚拟内存区域。返回vma的一个。起始弟子。OK是吧,啊。就这么多啊,就这么多。啊,整体思路啊。整体思路,我们现在啊。全部都给大家讲解完毕了,是不是?那么有任何问题啊,我们可以通过这个什么呢。QQ啊,跟我进行进一步的沟通与交流,是不是,所以今天晚上的课程。那我就给大家分享到这里是不是?所以我们现在通过这个图形我们搞清楚啊,你看我们总结一下是吧。
86:05
OK。就这个啊。跑走了是不是。好。那么通过这个图形。就是进程使用啊。M lock系统调用的时候,就ma这个系统调用的时候。那么就会调用什么呢?MMY,然后分配物理内存,并且建立映射,再通过用户啊,程序很少使用这个VVM什么呢?这个lock的分配这个掩码。所以说BK这个系统,它不会为这个用户进程马上分配一个什么呢?物理页面,而是一直延迟到什么呢?用户进程需要访问这块虚拟地址空间的页面。
87:06
发生什么呢?当它发生这个区域中断,才会分,才去分配这个物理内存。并且和这个虚拟弟子直接建立一个映射关系啊。这个后面啊。我们再进行进一步研究。那么今晚这个课程啊。我就给各位朋友啊,各位大佬们就分享到这里。啊,我们下一次课啊,再继续是不是。啊,你感觉这个管理多个进程断描述,那那肯定更加复杂了,那不是一般的复杂,是相当复杂,比如说进程调度是不是,比如说进程管理调度这一块是不是。内存管理这一块。等等啊,文件系统都比较多啊,OK好,所以今晚我们讲到这里了啊。各位朋友啊,再见是不是啊,下一次课啊。
我来说两句