本套课在线学习视频(网盘地址,保存后即可免费观看):
https://pan.quark.cn/s/f534659ad2fb
声明:所有发布内容来自网络,仅供用户学习交流测试网速使用,部分影片如有内嵌广告,请勿上当受骗。获取的所有内容请在24小时内删除,禁止非法恶意传播或商业用途。如有侵权,请联系删除,个人微信:sumith,防失联。
好了,在说这个页之前,我们还有几个基础性的东西要讲一下。就第一个第一个这个内核文件内核文件因为我们之前学的是段,所以是段的时候都是通过这个模拟bug动手去做实验的。我们也没有去分析过任何东西是吧。那这个时候我们也没有去过多的去关注32位下的这个里面的各种文件,只是跟CPU指令的打了一些交道,对不对?好了,各位,我们先打开这个CPU打开我的电脑,找到C盘,再找到这个windows,找到我们熟悉的这个系统的32。然后在这里面注意在这里面有几个文件,你有几个文件值得我们注意的。各位请看,在叉P下有四个文件也就是在这个win 7伤害之后,可能只有两个了。那这两个文件一个是叫做NT科勒NPLPA,还有个人叫NT科勒这个NL这个对应的是我们分页的内核文件。比如说我们29912是这么一个文件,那这个不是就是101012是这个文件,29912是这个文件,这个PA,这个PPA就是那个PAE的意思,这能理解吧?各位。也就是说如果我们选择的是这个列表,就是101012的列表,那么就是这个内核文件,就你所运行的内核文件就是这个,就我们的系统是跑起来的。如果你是29912的,你手你你的这个启动的EXE是这个我这么讲能理解吗?各位?所以在后面的这个分析的时候,你去看这些东西,它就有不同的效果,知道吧?各位,64下只有一个,64位下只有一个。好,这里面还有一个我值得跟大家说一个说的一个东西。那么各位我们退回来,注意我先把这个先给大家说保留一下。299123姐。我先把这个给你记录一下,免得等会你忘了。我们的case他们再C什么三角好了,我们是这个文件。运行运行的类,如果是这个101012,是这个。那么在叉P里面,它是有四个的,各位,还有一个,还有就是分多核和单核,知道吧?分多核和单核。但是在win 7之后,win 7伤害之后,它只有两个了。注意这是32位特有的,我把它们复制一个。好,保存一下。好了,还有一个值得我们注意的,各位一定要注意。我们找到在这个windows,注意是一盘windows,有还有一个目录叫drivers目录,D开头的,我操。drivers. 在34是怎么32键,这个没找到,在这里,这个目录下保存的,注意。保存的都是一些系统驱动,知道吧?当然了,这里面不是完整的系统,所有的驱动都保存在这里面,知道吧?各位不是完整的,比如说我们还有什么hel模块,什么win 32K之类的,可能没在这里面。当然但大家不一定是win 12K,这个是2K我看一下是不是在这里面,确实不在这里面,确实在system 32下。那么这里面注意我把它复制出来,注意把它复制出来,先复制在这外面,我随意的复制几个。我把它全部复制到桌面上来,我打开这个小辣椒的这个工具,在这里我把它拽了过来,然后在这里你找到它的导入目录,各位看这个。能看到这个吗?我们再拖一个,看它的导入目录,你永远都看不到它引用这个文件。各位你永远都看不到他引用的这个内核文件,但是他偏偏能在这个29912下使用的这个内核态。这些驱动偏偏能在这个29912下跑起来。兄弟们。知道吧?这个我是跟你们说,后面你们肯定会碰到的。因为有些时候你需要查询他的模块,知道吧?查询你当前模块,你去调动态的获取函数头里面解析一些东西。那这个时候,它由于它的名字不一样,那导致你获取不到,知道吧?实际上它内部的时候修复的时候,各位,就像我们dell一样的,它deal一个deal加载,它要修复它的导入表,对不对?各位,这个里面它也是一样的,要修复导入表。如果你运行的是29912的话,那你名字不是错了吗?他找不着了,对吧?系统的内部是有处理的。各位这个名字和这个名字它走的他有一个判断,知道吧?有一个判断,这能理解吧,各位。它是有一个判断,我这么跟大家讲一下,这是一个课外的知识点。那为什么要说呢?因为你容易犯错,知道吧?而且我们后面写代码的时候,去拿这个内核,去取模块的时候就要判断这个名字与这个名字。就是如果是一,如果等于这个或者等于这个,那么它通通属于这个内核,知道吧?好了,注意,这里面所有的都是一样的,它没有引入那个东西,我在这里跟到大家稍微说一下好了。驱动程序是谁加载的?好,这个后面我会讲。实际上这个是我们我们这个windows里面有一个叫注册表的东西,各位知道吗?各位知道吗?有一个注册表的东西,就是这个玩意儿。我们的驱动什么时候加载?是不是起开机的时候加载,或者是运行到开机界面后加载,还是说自己主动运行。它不是自动的跑,是主就是你必须要点一下运行,它才会运行这种对吧?那么这种上面是有它的这个类型的,在这个目录下我跟大家稍微说一下。在这个目录下,这个什么control set 001、set 002,还有control这个set。那这个control set是什么意思?这个001和002可能有些人的系统还有003、004,那么这个东西是什么东西呢?是我们的驱动被映射到这个就是被写的这个注册表项。如果他的注册表项已经满了,那么就会多出来一个002。如果这个002这1项的它超出了它的规格了,也就是野马了,就会多出一个003。那么这一项这个content的,注意这个control set永远映射的002和001知道吧?是也不是说是它的合并项,是当前所加载驱动的映射项,也就是你所有被加载的驱动都可以通过这个里面被找到,知道吧?这个能理解吧。那么我们的你看这种系统驱动在哪呢?在这大家看到没有?来来看到没有?这些看到了吧?那像这种类型就就标注了就标注了它是不是一个驱动,或者是一个deal,或者是一个ESE。那么这个start就是标注了,如果B等于0,那么就我开机就自启。那说开机是自启是什么呢?加载boss驱动的时候,也就是内核NTOS它拉起来的时候,那么拉修复完毕就开始加载驱动。那加载驱动就首先把你加载起来,那就是boss加的。如果你等于2,会等于这个零和1,就是这种boss加的。那等于二就是说进入到开机界面的时候,就是你在登录账号的时候,那个界面就在加载,知道吧?那么还有一种就是这个第三种,第三种就是我们必须是手动点运行,停止运行停止知道吧?各位也就是你写个程序去加载一下这个驱动,这种基本上就是三号类型,其余的这个就是一些其他的了。比如说这个是显示项,那么像这一个这个是它不是特定的,这个driver包,这个ID不是特定的,那么这个也不是一个错误控制,也就是返回一个错误码之类的那这个是组,这个组后面我会讲。还有这个东西,这个part是什么呢?就是我们的路进这个组很重要。比如说我们什么时候让他开机自启呢?就开机自启的这个顺序是什么呢?是根据这个组来的,知道吧?兄弟们是根据这个组来的。不是说你在这里写个零,它就开机自启,而是你的组必须是能在报boss的这种组才行。如果你是要那个显示在登录界面的那个就是windows进入登录界面的时候去加载的话,那你就可能是另外一个组。比如说这个mini fut文件组或者什么网络组这种组才行,知道吧?好了,这是就我现在不过过多的阐述了。好了,我们再回归回来。我操。好,各位,我们首先来看一个东西,我在这儿,首先先打开一个十一。我们再打开一个十一,对吧?我在这里比如说我打开一个这个EXE,我同样的又打开一个EXE,我用这个CE去去加载,去看一下这个进程,用这边这个声音来看一下这个进程,对吧?看一下下面这个进程,这两个进程各位请看啊,看这个地方,数字I,我操我这里面没有截图。这个数字的ID,注意它不是一个,这个说明了我这个说明了我不是同一个进程,对不对?我们在这里看一下这个进程的内存,我们在这里也看一下这个进程的内存,由于我们是同一个进程,是我所说的它有代表性。因为它同一个进程的,因为它是同一份EXE的这个文件是吧,所以它的代码什么是一样的,对不对?那你可以看到它的这个EXE,也就是它的模块地址加上2317,这个等于6A00这个字节码它也是一样的,对吧?那我假设把这边改一下,注意我这么改一下,各位我改一下之后,这边变了吗?兄弟们这边变了吗?地址是一样的,各位我地址是一样的。但是我进正面的进程改了之后,我并不影响就是我这个虚拟地址是这个402317是吧?这个虚虚拟地址也是402317。但是各位我改了,这边我这边没有改,但是虚拟地址是一个,对不对?对吧?是吧还有个问题,什么问题呢?各位,我把它给关了对我把它给关了。这个内存才多大呢?各位这里是我的物理地址,拆两兆,拆2048,这个要注意,这个四七是一样的。这可能是也就是我在这里,我的虚拟机分配的这个空间才2G对吧?我看一下是不是,各位可以看到才两G对吧?但是我们的这个进程和服务有很多。每一个进程或者服务,它其本质上都是这种服务其本质上也是一个类似的一个进程一样的概念,对吧?那也就是我的进程在在这上面有非常多。我们之前就听经常听到外面有个概念说一个进程就是4GB内存。那兄弟们,我一共物理地址,就是我的物理地址才两G那我一个进程就4G那我这里有几十个进程,我的物理地址如何能装下这么多个进程的虚拟地址来的?物理例子,小于就物理内存少,小于实际小于这个虚拟内存。物理内存小于虚拟内存,对吧?你放在这里。好了,各位。咱们的要学这个的,刚才我只是跟各位产生了几个问题,这几个问题要随着我们慢慢的加深,来看它知道吧?咱们今天要干的一件事情就是你把这个物理地址的拆分给我弄明白了,知道吧?也就是我们一个虚拟地址是如何来找到物理地址的,好了。各位,我在这个地方创建一个文档,这个文档比如说我乱写几个字符串,对吧?乱写几个字符串,我打开这个十一,注意我打开这个十一,把这个文档,我这个进程,note pen的这个进程,我加了进来对吧?加载进来之后,我们在这里进行搜索。那各位我们搜索的是字符串,是不是各位?所以我们在这里要点击点击这个左,我们在这里把这个复制进来,把它搜索一下。我们进行一个扫描,还有新的扫瞄我也扫不到,看到吧?各位。实际上你得把这个勾上,你得勾这个,因为这里面都是uniq的,我们再收,那这个时候我们就收到了对吧?收到了几个不同的值,那么给它拉大,注意给它拉大。那各位这里面我们怎么来确认这三四个是哪一个呢?是不是各位改它一下,注意那你像这个随着我们的框拖大,它就变动了,那这个肯定不是。那么这几个我们在这里,比如说我给它改成二好了,各位可以看到,在这里没有变,那么证明了这个地址才是对吧?那证明这个地址才是,那么我把它两个删掉。好了,有了这个地址之后,我们来证明一下,有了这个地址之后,我们要进行一个查找。好的,各位,那这边也变了,各位可以看到,我再给它改一下。比如说我改又改成4对吧?来改成4,注意这个是不会刷新的,因为我们没有点进去,我们再过来你可以看到,当这个窗口置顶的时候,它产生了一个刷新的。好了,这样证明我们找到了,找到了之后,我们把这个地址把它拿出来。我们干的就是这个地址,我们这个是一个虚拟地址。那么在我们之前所学的时候是什么呢?各位断寄存器是吧?的base对不对?再加上了这个什么呢?各位加上了我们所谓的虚拟地址,哎也不是这个逻辑地址,等于我们这个线性地址。各位那么各位我们的base一直都是零,所以这个我们可以忽略掉暂时。那么各位这个地址我们之前学段的时候是这么讲。实际上我们要获取到里面这地址的值的时候,他还要经过一个很长的算法。而且这个故事特别的长,知道吧?我们拿到这个地址,注意拿到这个地址。拿到这个地址,那么这个地址,注意这个地址我们得给他。因为我们现在所学的注意是101012分页,注意所学的是101012分页。把这个线性地址给它拆成三部分,拆成三部分。因为你这个101012个位加起来就是32,32个位。我们四字几年正好是32个位,知道吧?一个地址就是我们的这种地址,是根据你的总线,就是我们说我们的这个位数来决定的,是吧?比如说你是64位,那么你这个地址就有64位,也就一个指针就有64位,对不对?如果你是32位,那你一个指针就32位,对吧,是不是?各位,所以我们给它拆成三部分,那么这个12,注意这个112它是占12个位,对不对?各位每一个位每四个位就是我们16进制的一位,对不对?各位。我注意二进制的四位就是16进制的一个位,对吧?那么你你我们再给他拆一下,我现在给你拆一下,先这么拆一下,000,把这个零给拆成四个位,那么这个零也拆成四个位好了,这里是幺是吧,001。对,这个是A是不是?那么是1010对吧,这是E110是吧,还有这个是1180001,0001,八是他对吧?好了,你把这个蔚拆成拆成了这个101012。这个是12位,对不对?34 12好了,12位,那么这个数十个,那这个是四个,数十个那就它了。那各位。好了,这个我们我们不需要做排列。那么这个我们各位四个一组,那么前面不足的补0,前面不足的补0。好了,这边也是一样的,前面不足的补0,但是你它实际上因为它是四个一组,所以你应该是这样。前面不足补0,注意前面不足补0,那么各位。这个转怎么转它都是零。你二进制它本来就是零,所以你转换成16进制了,它还是零。那么像这个各位它是一,这个是A,然后这个是1,所以是EAE是不是各位,其实就是它,对不对?这个118没有变,因为它后面12位是完整的,知道吧?118那么这个注意这个后面我们要学的它的这个结构,这个叫做什么呢?叫做页目录页目录项,准确的叫页目录项,这个叫做页目录页表项,这个是页内偏移。好了,这个是业内偏移。我之前跟大家讲过一个页,就是4096个字节,对不对?各位我讲过,那么这个4096个字节为什么是这么说呢?原因是MD和英特尔对吧?把这个后面它无论是什么9929912还是101012,还是后面我们要学的64的这个9999999912。那么它后面都是12,这个12叫业内偏移二的12次方,知道吧?二的12次方正好是4096,知道吗?各位?我们过来找到把它变成科学型,注意科学型,那么二的这个注意12次方,我操,稍等。2的12 13,各位看看到了吧?所以这个叫业内偏移。它的每一个烨为什么是4096呢?因为它的业内的偏移只有4096个字节,恰好的是4K。好了,这个等于我们后面会说那个结构,现在我们只需要知道是这个鬼样就可以了。那么这个是页表项,那么也还有个说法叫PDE对吧?那么这个叫PDEPDE。好了,各位我们来讲,我们知道这个之后,我们来看一下。首先这个过程,各位这个过程先在脑海里面补一下,它就像一本书一样的。比如说我现在手拿着一本书,这本书你翻开一页的时候,它就有它的页面,就是它的这个一第一章、第二章这种目录,对不对?各位你通过这个目录,后面有个页码对吧?这个页码你可以找到你的页数,对不对?各位就通过这个,比如说第一张是第十页,那么你就翻到第十页。翻到第十页比如说第十页有一个什么字?比如说他或者我或者有个这样的字,那么第十页的第多少个字对吧?那么这个字就是代表这个字的偏移,就代表业内偏移,在这个页上的偏移,懂我意思吗?各位,我这么说懂不懂?那么这个过程,首先第一步我们要得到这本书,是不是?这各位我们要找到这本书,注意这本书在哪呢?也就是每一个进程它都有一个CR3,这个CR3就代表了这个进程,这个空间的这本书,对吧?所以我们要找到这本书,先编辑一下进程。我们的那个进程的名字叫load point哎也,就在这儿。这个就是它的CR3,我们用过了,我们在断的时候,就任务断的时候有用过它,但是不知道它是干什么的。这个就是那本书,找到这本书,我们注意物理内存,它都是要加感叹号的。比如说我们滴滴一下,你这个要感叹号,滴滴不能滴滴。比如说我们滴滴,你一看全他妈是问号,你以为它不可见,它实际上是物理内存。所以你这个地方,你就是感叹号,滴滴你就出来了。那么我们找到这本书的时候,这本书有这么多目录,是目录的第几个呢?第几个?是第零个目录,那也就是第一项,对吧?第一项也就他,注意,那也就是这个是什么呢?加上0乘以4。那有些人会问了,虎哥为什么要乘以4?因为它这里面每一个都代表的是指针,懂我意思吧?每一个代表的都是指针。那在你32位下,像这种101012下的这种指针,它是四字节的那你这个也就是每四字节是一项对吧?所以你要乘以一个四,才能找到它具体的位置。比如说它就是第一项,好,我们我们拿到第一项,再滴滴一下把后面的12位去掉。那有的哥们会问了,老师为什么要去掉后面的12位?这个后面的12位,在这个目录页目录下代表了你可以把它理解为书的注解,也就是注意事项,知道吧?也就是属性,属性后面我会讲,再用它再加上这个我们的列表,也就是找到我们的具体的页码。在哪个页?首先找目录,再找页对吧?好了,我复制错了,这个是要1乘以4,注意乘以四好了,我们找到了一个页,在这个页里面他注意这个书的字它不是固定的。但是他的我们的这个学计算机里面的这个东西,它的字是固定的,也就是440 4900 4000 094096个字,对吧?所以我们这一个字在哪里呢?在118,在118。好了,我们DB一下。对,DB一下。各位看这个地方我找到了没有,或者各位DU一下。这个DU是显示用力扣的,但是我不知道物理它能不能支持,你看它也是知识的,DU一下,DU一下。第五项各位这个就是我们找出来的,它具体的存在这个地方对吧?那么我们再退退过来,各位再来对比一下。找到了没有,各位?找到了没有?这个操作是啥来着?这个意思是去掉,注意是去掉这个CR3的页属性,知道吗?是去掉后面12位的属性。这个属性后面我会说,它每一个位置都有它具体的含义,这个含义我们得一步一步的来了解,能理解吧?好了,你们的作业就是把我就学会在这里面先帮我拆了找,找了拆,知道吧?好了,那么在我们学知道这个东西之后,各位能能后面我们要学的,后面我们要学的。后注意,刚才我说了我要说啥了,忘了我要说啥了。各位好了,我们具体看了这个之后,我们得把大框给说一下,各位得把它的这个大框给讲一下。因为这个东西在我们学的这个东西都属于细枝末节,都属于这种比较细的东西,对吧?但是你看不到大框。好了,各位。首先。首先我在这里先给大家稍微的讲一下,我们的CR3大概是这个样子,这个C这里是一个页,注意CR3它也是占一个页的。这一个页,也就是它占的这个页,是4004096个字节,知道吧?除以四等于1024项,注意也就是这个CR3固定有1024项的目录,知道吧?也就是CR3这本书里面存的1024个目录,这个里面存的这个值。注意这里面存的这个值,在这个101012下的分页里面,叫做什么呢?叫做PTE,PDE知道吧?也就是这个叫什么配置,the direct是吧?这反正这个目录怎么写我忘了,反正可能我当时有点可能当时错了,夜夜目录表,注意CR3的叫夜目录表。好了,那么这里面这个PDE是代表是element,是一个元素的意思是个元素的意思。各位每一个PTE。每一个PTPDE,PDE指向的是一又是一个表。这个表也是40也是1024项,所以也是201024项。这里面叫做PTT,也就是。这个腿。还有个题我忘记叫什么了,是这反正这里还应该还有个什么什么好了。不管他,反正你这里面就还有一个叫PDE,这个你查一下英特尔文档应该也有。这个是元素的意思,那么这里面注意一个PDE指向了一个PTT的表,这个表里面又存了1024个PTE,那么这里面又有注意它的每一个PTE指向的都是一个物理液,指向的都是一个物理液。我把它回退一下,算了,就它也是4096个字节,它就不是一个表了。4096个字节里面存的都是你的内容,知道吧?它是根据你一个提供的地址,根据这个页内偏移去找的对吧?比如说我们刚才找的是个118,那么它就在这个位置对吧?在这个位置这个能理解吧?各位,就是从PDPDE找到PDPDE里面找PDT,在PDD里面再加上偏移找到PDE,再找到物理对应的物理页,在物理液中再加上偏移,就能找到你的所谓的真正的数据的数据,有数据的地方,知道吧?这能理解吗?各位?刚才我们干的这件事情就是这就就是这件事情,行吧,从这个地方找他,再找他,对吧?是不是各位?好啦,各位。现在这个没完,没这么简单是吧?现我们现在各位又来看一下这条指令。我们从刚入门的时候学这条指令觉得挺很简单是吧?各位有没有觉得很简单?兄弟们,现在我们随着我们的知识的加深,有没有觉得这条指令他们内部处理还是特别复杂的,是吧?谢谢各位。好了,各位,我们这一条指令是怎么来寻的,各位是怎么来寻的?首先我来画一条地址总线,各位。比如说我们所有的硬件都是挂在CPU下的这条总线的对吧?这是我们的一条线,好了。这是一块CPU,当然了这个CPU内部我不好画,我把它画到外面来,注意把它画到外面来。在这个CPU部件里面有一个什么呢?有一个MMU,注意这个是在CPU内部的,我只是把它画出来,这里有个MMU。好了,还有一个什么呢?在它内部还有个什么呢?画长一点。调皮好了,还有什么呢?再往长一点,页表缓存。好,还有什么呢?就是L一一级缓存。我们再来一个。这个是大概就是我们一个地址要经过的这么多东西,那么是怎么经过的是怎么经过的?我来说一下各位,不然的话我们现在注意我们现在要学的是哪个地方呢?是它MMU里面是怎么来找物理地址的。那么随着你后面的加深,你有可能会学到这儿知道吧?那么一级缓存我们是看不到摸不着,也做不了实验是吧?暂时除非你能复现那个幽灵漏洞,对吧?你可以去感受一下。懂我意思吧?好了,先来看一下这个,先来看一下这个,这个就是刚才我们查找的过程,这个也叫做MMU,也就是那个叫做什么money,内存,我manager,youtube,管理单元,内存这个管理单元知道吧?他是怎么来找的?注意首先CPU会丢给他的,CPU会丢给他,把这个把你的地址和CR3会丢给他。当然这里面模块具体的代码是怎么设计的,这个我没有参与,是吧?各位你就不要问我里面具体的很细的东西了,因为我也没有参与是吧?好了。函数,注意大概这里面这种硬件,注意我再说一下,硬件称为模块。模块在我们软件里面称为函数或者方法。也就是这里面的全程设计其实就是一个函数。但是在硬件的说法里面,他们称之为模块,知道吧?他所说的模块就不是你你你在这个软件里面用的掉了,或者是so,或者是这种驱动,是吧?他所说的是函数,所以一个模块里一个硬件一个固定的里面通常是一个模块是吧?就是有一个函数在里面。那么这个函数的原型大概是这样的,C23线性地址。这个数据。比如说读。返回了,有了,我这个只举个例子,是举个例子,知道吧?兄弟们是举个例子,大概的设置原型的差不多是这样。各位他首先不是去找,首先不是跟我们一样的去把它拆了运算,注意。不是拆的运算。首先干嘛呢?他这里面会说我找啥找我也难。我首先来看一下TLB,这个TLB大概是个什么样子呢?就是个这样的格式,这个叫做数据这个地址页,这个叫什么呢?物理页。各位他首先拿把这个地址,注意把这个地址线性地址,注意线性地址,线性地址的这个什么呢?那比如说线性地址,干什么呢?与上零叉FF取法,注意这个什么意思呢?去掉后面的页内偏移知道吧?或者你可以把它理解,为什么呢?12就是这么一个地址,他把这个去掉,这个就是一个页,注意这就是一个页。那么拿着这一部分去这里面进行一个对比。比如说物理液对应的是1234123,物理页对应的是他。好了,那我就知道找他了,那各位懂我意思了吧?首先会把这个去掉,在这里面找有没有这个地址。你说如果说有,那么他就把这个物理液返回,他就不再计算了,他就不再拆分了,知道吧?不拆了,直接查缓存。拿着这个物理地址直接往L1、L2、L三中搜索,知道吧?懂我意思吧?各位就这么个过程好了。如果跳B中不存在,也就是说它没有这种对应项,没有这种缓存,怎么办呢?那我就干什么呢?拆。拆一个PD拆一个PD。去这里面搜索,注意去这里面搜索页表缓存,在这里面找,我这个PDE我这个PTE里面有没有缓存这个PTE?因为它注意,我为什么说它?那你可能觉得虎哥那他一次性拆完不得了吗?那为什么非要找这个缓存呢?各位实际上他就算读一个PDE,他又要经过拆四步,知道吧?又要经过这么拆拆的一个过程,懂我意思吗?各位,就是说你取出这个PDE,你这么去看它的时候,其本质上它还是要拆一下的对吧?所以它为了减少这个拆的复杂度,他首先他把这个弄的把这个PDE求出来,在这里面拆一下知道吧?拆去去看一下有没有对应的缓存,PDPTE然后取出来。那么就取出来之后,直接就可以计算出物理页了,对吧?直接就算物理液就直接拿缓存,也就命中了。直接去缓存里面找对吧?好了,如果他也没有,如果他也没有那怎么办呢?如果他也没有怎么办呢?拆,只能拆了猜对吧?计拆了计算出物理地址物理液物理液,那么拿到这个物理液之后,反正他只要得到这个物理液之后,他就必定会往这个L一中搜好了。L一叫一级缓存,一级缓存。这种一级缓存也称局部缓存。局部缓存它的大小通常是32K或者64K知道吧?但是这种缓存是每一个核是包在核里面的,就比如说我CPU有四个核,那么它就有四套。所谓的L一这个套是怎么理解呢?就是它这一套,它就有这个数据缓存和这个指令缓存。懂我意思吧?各位?一套就是有两个缓存,一个指定的一个数据,那么L2,它是没有数据和指令的。当然这个看看CPU,看CPU,但是L三它只有一个缓存,也就是数据和指令都缓存在一个缓存点。那L2它有些CPU也分数据和代码缓存分开的,有一些没有。所以我们在这里都通通认知为没有,只有L一有好吧?那么这个是我们的具以后看到具体的你自己要应对对吧?但是我们在这讲的时候,假设过程没有好了,各位它在这个一级缓存中他找不着,那么它就会远一点去二级缓存中找。二个也没找着,那么他就会往三个去找,往三往这个缓存三级去找,三个还找不着,他就在干什么呢?如果如果都找不到,那么记再记再一次计算缓存,再一次计算的这个绑卡地址。荀子。这个内存条。各位,那么我现在又问题来了。好,他把寻址到内存条之后,会怎么办呢?会怎么办呢?他在这里面把数据一读出来就会干什么呢?把这个数据缓存到这里,缓存到L一上,因为它会就近缓存,列表该缓存的它都会塞进去,缓存TLB会给你缓存起来,把结果再返回。也就是他读完数据之后,如果是没有缓存命中的数据,那么他会把这个缓存一路缓存回去,一路给你塞回去。后面他再一次触发的时候,他查找的速度就非常快了,知道吧?那么什么时候缓存到二级和三级里边呢?这个就是它内部的这个计时器了。比如说六个指令的六个指令周期,或者十个指定周期。这个什么意思呢?就是每一行指令或者两或者三行指令,或者六行指令的算一个指令周期,知道吗?这个看CPU内部的它的一个算法,懂我意思不?各位?所以这个就代表比如说我们现在是一行一个指令周期,那么六行之后就会起就会把一级缓存有些内容会写回写到二级缓存中去。这是它缓存内部干的事情,不是MMU干的,懂我意思吧?再隔一段时间,30个指令周期之后或者是多少个指令周期之后,会给它缓存到三级缓存好了,那么缓存它怎么缓存的呢?各位它它是有一个格式的对吧?我们打开它,打开它,这个是我的,我来看一下我的,各位,这个是我们的一级缓存,这个是二级,这是三级。各位可以看到我的缓存,这里面是分这一级缓存的指令缓存和和数据缓存。各位可以看到,这是二级,二级和三级的没有分对吧?这个二级和三级各位可以看到是没有分的。我再说一下有些CPU2级缓存也是它的局部缓存,知道吧?二级缓存也是它的局部缓存。比如说我这个各位我这个就是我的局部缓存,各位可以看到4乘以256K那么有可能会问了,为什么是四呢?不是八呢?那火哥你CPU不是八个吗?对吧?这是什么呢?是因为我的物理核数是4,逻辑CPU是8。它只是会给你的物理CPU加缓存,并不会加你逻辑CPU。我是我是一核两线程的,也就是四核八线程。那懂我意思吧?各位,我这四核八线程,所以它只有四套,它没有八套。两个虚拟CPCPU用一个物理CPU的东西,它是这么一回事。好了,那么这个后面各位请看啊,后面有一个什么呢?有个什么呢?有一个八瓦是吧?是不是这个各位,还有个四瓦,还有个十6瓦,这是什么意思呢?这是什么意思呢?就是八路的这是四路的,这个是16路的,就是这么一个意思。那么我怎么来理解这个路呢?各位,八路这个路泗路的。还有16路是吧?好了,这个路我们怎么理解呢?那我切到缓存这里切到缓存这里,切到缓存这里,各位主要要理解这个路,我们要理解一下这个size,size也就比如说举个例子,我有三这是32K32K举个例子,32K32K,我的一级缓存32K那么它的意思,我每一行有64个字节,每一行有64个字节,这是123456782,因为我四个字节一组。四个字节一组,它应该是叫64个字节一个组一行,64个字节一行。那我为了拆分给你们好看一点,64个字节一行,这个64个字节一行。要每这32K要分多少个组呢?他是这么算的,用32K32K乘以1024转换成字节,32乘以104转换成字节,除以所谓的路数,除以路数,再除以64,也就是除以每一行,那等于一个结果。那我们来算一下。32号,乘以1024,除以8,再除以64。好了,好,各位,我这里是64组。是64组,那么它每一组,各位64除以8是8个八行,每一组是八行。每一组是八行,那么一行64K64字节。懂我意思吧?好了,知道这个之后我们就开始说上面了。也就是说它的缓存是这么缓存的,把L一要写回2L2的时候,它是娶一个组来娶一个组来写知道吧?那么各位我这里每一组是八行,一行是六十四。那各位我这个要放多少字节呢?要64乘以八蛤蟆。512哎也,就是我每一次把L一或者L一要挪到L2的时候,我一次要挪多少呢?要挪到这边,挪512个字节。这个能理解吗?兄弟们,从这边假设我要我要放到这里面,也是512个字节。那么假设我从L二中要给他要把这个缓存又读到L一中,要读多少个字节呢?那你就得看你的L2的这个路数,他也不要要256K是吧?四路的六十四字节一行。那么你就按照刚才那个算法就知道了,它求出来,把这里面的一行,把这里面的这一个挪到这里面来。因为有时候你从12中能找到是吧,能找到你的数据,那么他就会把这一段这一片的字节给它移动到L一中,然后给你缓存起来,以便你下一次再读。那么这个挪到L三是同理,这个能理解了吗?能理解了吗?这是它整个基本上它整个寻址的过程,所以我跟各位说,其实本质上我们就是这一行代码可以学到把保护模式学完。能理解吧?兄弟们,他挺复杂的,是不是他走这个路线,然后到MMU,然后再再到这里,调B再到页面缓存在L1、L2、L三中,不太理解这个512是怎么拿到的。首先是这样的,我再说一下,我们的比如说我的这个L一的缓存一共是32K这个没问题,就我当前和来说是32K的,对吧?这个八是八路,八个路线为一组,知道好了,那么它要首先你这么才能求你这么一个求法,32K除以8除以64。这个64是我们的每一行,就是我们缓存的行数,每一行是64个字节,缓存的函数是64个字节,我知道吧?一行为64个字节。这个能理解不一行为64个字节,那也就是假设我这个32 32乘以1024好了,等于这个数,然后除以了64个字节,那我一共有512行,这个没问题吧?啊,512行有没有问题?我我我就是用字节除以行数行的,每一行的这个字结束,这个应该没问题。好了,懵逼了是吧?好了,我我我这么来,我这么来。好了,各位,这是第一行。这是第二行。这是第三行。好了,我的话这个是我们的L一,是我们L一,我们L一中是吧,L一中一共有32K。注意32K我们来看一下32乘以1024,转换成字节,这么多个字节好了,这其中的每一行每一行它是64个字节。首先,各位。我这么反过来问,多少行不是固定的,不是固定的。各位注意不是固定的,是我的CPU是这样,你的CPU可能不是他,知道吗?你的CPU可能不是他,这不是固定的,是看主要是看你自己的这个CPU它里面的配置。这个配置是固定的,配置是固定的不能改。但是这个是出厂配置。所以你的CPU比如说你的型号不一样,那出厂的配置它不一样,那么它的这个函数的大小是不一样的。注意,我这个有我32K1共有多少?六和一共按照64字节一行,那我一共能有多少行呢?各位这是小学数学题,兄弟们是不是小学数学题?我假如我两行就是128个字节,那三行我再加上64是吧?你这么一算,那你最后还不其其本质,就是32768除以64等于多少行,对不对?各位。那么好了,知道这个函数了,注意知道这个函数了。那么这个8 will这个是什么呢?这个瓦吧瓦是吧,8瓦就其实也就八路通的,八路的这个意思,也就是说你用这个你用最后出来这个函数,去除以这个8,那么就能得到这个组。懂我意思吧?一共有多少组?你比如说它除以8,那除以64,那这个是多少行?再除以8,那一共是对,64组,64组,64个组。这个一组。这个一组关键是这个一组,各位每他你知道他一行是64个字节了,是不是?一行是64个字节,那么每也就是。也就是每一组,它这个64里面有你你得乘一个。我看一下,64这512,512行,512行,那么它除以8是64 64个组,64组,那么你这个是再除以再再乘以这个64个字节,4096,4096我看一下,每一行是每一行每一组是八行,这个是每一组是八行。64。一组4096个字节,我看一下4096,4096个字节,也就是1K。不对不对不对,应该是512,一组是512个字节,因为。我刚才我怎我又忘记怎么算了,因为你看啊,你你你这只有32K。你这只有32K1共你一共有64个组,对吧?那你每一组假设有4096个字节的话,你变成46K了,你变成46K了,变成64K了,知道吧?是64 8行64。64枚除以这个应该是64除以8。刚才我们是512,512除以8的话,这个是算它有多少个路途。我看一下,3 32K乘以1024,再除以64,再除以8,这个是算它的组,一共64个组,64。再除以8,这个是因为它一个组是八个,注意,因为它一个组的是八个。那我们我们再除以8的话,就得到一个组,得到一个组的所有函数,然后用这个函数再乘以64,我操知道吧?再用组的,因为你64组,64组每一组是八个,每一组是八个,那除以8的话,六六等于8。每一行就是有60 60,每一行它是64个字节,那么这个等于512,那512的话,它乘以32K。再乘512,我们再乘以64,正好是又算回去了,对吧?正好字节也对得上。我再说一下。刚才被你们绕了一下,把我绕晕了。好了,各位首先这个32K你得转成字节,用字节除以这个64,得到了得得就除以每一行的字节数,得到了我们的这个我看512,得到了我们的多少行?一共有多少行?每一行分多少个组?每这函数一共分几组?通过这么512的总函数分几组?那组在这儿在8,一共68 64组。那么我们用64再除以8,就每一个因为它每一个组它是八行来从也是通过这里是八行。那这个地方是每一个组是四,那四每一个组也是四行,那么也就是得到一个八,再用它来乘以6。这个函数乘以64,求出了一个组一共有512个字节,这个能理解吗?各位?计算计算函数,计算这个缓存,一次缓存。字结束,计算这个,那么。用这个总字节数来除以我们的每一行,也就是恁筛子、嫩骰子、恁size等。再除以,这个叫做查瓦特是吧。等于多少组?等于组插组,等于Y组,这个没问题,各位好了,再用外组的。来除以这个。啥勿脱。字结束。好了,大概是这样的。对的,他主他这个举个例子,就基本上我把这个32 32K乘以1024转换成字节是吧?这个是转换成字节,所以你再除以我们的函数,像我的CPU函数64字节,再除以8得出总组数对吧?这个总组数是64个组,对不对?64个组,再用64个组总组数来除以8万。等于这个。在一组八号。求出一组八行。对吧求求一组有多少行数,再用8乘以64字节,因为一行有64个字节,那么等于。主动。去结束,这没问题,各位,大概就是这么一个过程。好了,注意这里面往L2中挪的时候,它就是这么挪的。那么L2中往L一中挪的时候,你得反过来,你得算一下L二的这一个,它一次要挪L一挪多少,它是指懂我意思吧?这个能理解不?还有这个东西,我这么跟大家讲,因为它是CPU内部的制造,所以这个算法某些CPU的型号它还不是特别的固定,知道吧?当然这是我忘了看哪本书上有说,但是大小一基本上都是差不多的,基本上都是差不多的。但是它内部制造封装了,你也看不见摸不着,也测试不了。所以我们其实只能根据这种找到的资料,以及书上跟你说一说。懂我意思吧?各位你你像这一些我们是可以做实验的,你像CR3、TLB是吧?是可以做实验的,知道吗?所以这个我们是可以碰到的,可以自己把它弄弄就体会。那这些你就不好体会了,各位反正总之有一个点,CPU基本上CPU基本上是不查物理地址的,读的读写的通通都是缓存,知道吗?比如说这个绑卡,我们内存条它这个L3刷到内存条,它需要一定的时间,它不是说实时刷新的,知道吗?所以内存条里面的数据,它跟这个缓存实际上是不同步的,而是每隔一段时间会产生一个回血。所以后面我们还会学什么呢?还会学什么呢?就是这个缓存的类型。这个缓存它一共有有7种类型,但是其中只有4种,有有几种没有太大的意义。那么有一个WB,还有那什么WC,还有那UC,还有那个什么回血止血,还有一个叫什么我忘了,具体我后面查一下,这才知道忘了。一共大概就是有个回血、止血、无缓存,还有一个弱缓存,知道吧?这些概念我们后面会在学列表的时候也会慢慢接触到,知道吧?你懂你看你知道这个大框之后,你再去学的时候,你有你的感觉和你就只知道列表,这个玩意是不一样的,能理解吧?你首先要知道你在干嘛。不是直接就是数据,索引,注意它里面的类似,你可以理解为索引和数据。知道吧?当然了,它没有这么的简单,你可以去查一下结构,有些些说的或说把这一行,这就是这一行里面,他们有有一些说的是这样的,但是说的复杂一点,但是无法确认他的真实性度,我是无法确认他们的真实度。比如说这64 4个字节,其中其中注意其中比如说这一块有三个字节,它就是索引号。好了,还有这三个字节的什么哈希值,后面的全是数据。他把你这个计算出索引号,往这里面查哈希去碰撞。碰撞完之后这里面如果能碰撞到的话,就把这个数据拿出来给你知道吧?那具体的这个结构我也忘了,但是我但是这个应该百度能百度的到的,你可以百度一下。反正他们那种上面所说的,全是这种。有就是把这一行里面分成三段到两段,里面是一些什么东西。先往这个头部去寻一下,找一下。寻有的话有哈希的话,那直接把数据给你。所以基本上就是索引对数据这么一种格式,先找到索引,再把数据给你,这个能理解吧?好了,你们把这个实验做一下,把这个实验做一下,自己要学会拆对吧?把实验做一下,然后做一下之后,我们明天再来讲属性对吧?先把这个结构熟悉一下。没有作业,跳B段过去的段,喊喊这节课。你应该可以叫做前戏,是吧?因为这个其实不是课程里面的东西,但是我还是想把它给你们讲起来。物理地址怎么和线性地址对应起来的?我不是讲了吗?我再说一下,物理地址怎么跟线性地址对应起来的对吧?他给你一个这样的地址,没有挂所谓的P没有挂这个上面的这个点里面的东西,没有挂这里面的任何东西。那你跟我说那你跟我说,他有职吗?他能访问吗?肯定不能访问。比如说你这个地址,在这能找到你的PDE,那我在这里写一个一,那么这边写个2,那么你就可以得到一个二的物理内存,知道吧?而其本质上就是它通过MMA,当它找到它的所谓的这个结构里面有一个值,这个值并且是正确能访问的,那么你就有物理页。其本质上就是你给你这个信息地址挂了一个物理页,知道吧?也就这么简单,一个地一个县地址能不能访问呢?就是里面有没有物理内存,有没有物理地址和这个PDE和PTE,如果有,那么你就是一个有效的物理页,有效的虚拟地址。如果没有,那你就是不访问不了。对,是的,还有页表结构咋查的?好,这个其实你们现在还不知不懂什么列表,这个怎么查的呢?在这里面有啊。VT这本书里面还是应该有。我他妈的四维体这本书还是叉六四叉86,兄弟们,我看一下,我记得很早之前我是看过的。我们找一下,看一下有没有PD。这是TPTLB,应该在。应该在家里面。我靠。应该是在这本书里面,10 11 32是吧?页内偏移是在哪?是在物理页上,不在内存条。我刚才已经很强述,已经很在跟各位讲述了阐述了我们的CPU是不可能直接查内存的,知道吧?是不可能直接查内存的,就是直接查这种绑卡地址。也就是包括内存条,以及我们的鼠标键盘,所有设备包里面的物理地址,包括显卡地址,这种都不会去查的。通通走的都是缓存,都是映射的地址,都是缓存映射成物理页,物理地址。所谓的真正的物理地址也就是绑卡地址。这种绑卡地址是电路的那种脉冲,所以通常不是走到那上面,知道吧?都是查的缓存,这个业内偏移也不是查的这个对,你可以理解为缓在缓存里,它会通过这种页内偏移和线下地址计算出一个索引,在缓存里面进行碰撞,知道吧?业内就是页内偏移和你的物理地址计算出一个索引,然后进行一个碰撞,然后找到你所谓的物理地址,就是所所找到把这个数据返回给你,通过这个计算出的索引,然后通过数据返回给你。这个是直接在缓存里面拿的,他不是拿着榜,不是从绑卡的一直拿的。应该你可以看一下这里面,应该这里面有啊,反正我忘了是在哪个地方了,这个太久了。兄弟们,这本书我不知道发了没有我发到这个群里面,你们可以去看一下,就找就在应该是就在这一章的,就在这一章的里面绝对是有它的一个寻找过程的。他首先计算出是首先是去这个结缓存结构里面找的,找没找着才算知道吧。更多精彩内容关注下方公众号:逆向有你
个人微信:sumith
每日自动更新各类学习教程及工具下载合集
https://pan.quark.cn/s/874c74e8040e
还没有评论,来说两句吧...