为什么要写这篇教程呢?
本文章仅提供学习,切勿将其用于不法手段!
因为想要成为一名白帽黑客,汇编语言是必须要掌握的!
无论是二进制漏洞挖掘,还是逆向工程!汇编语言,都是硬性基础之一!当然,你还需要学会C语言!为什么要学会C语言呢?IDA软件 会将 二进制代码 翻译成 汇编语言 和 C语言 !
你不会汇编语言,不会C语言,想要进行逆向工程,以及更深层次的 二进制漏洞挖掘,是非常困难!如果你希望挖掘 二进制漏洞 ,你还要学会 代码审计 !
你必须看得懂,汇编语言代码 和 C语言代码,这是硬性要求!
想要参加CTF竞赛,汇编语言 和 C语言 都是重要的底层基础知识。
接下来,让我们接上一篇内容,继续讲解下 x86-64环境下的分页机制!
为什么要重点讲解x86-64环境下的分页机制呢?
WINDOWS 和 LINUX 的内存管理,都是基于x86-64架构环境下的分页机制去进行的!
分页机制,是实现保护模式下软件程序的重要技术保障!
我们主要讲解下,分页机制的4级页表的相关知识!
分页机制仅在保护模式(CR0.PE = 1)下有效!
是否开启保护模式,是 由 CR0寄存器的 PE 位(第0位)决定的!
在保护模式下,是否开启内存分页机制,是 由 CR0寄存器的 PG 位(第31位)决定的!
CR0寄存器,是什么呢?
CR0寄存器,是x86-64架构下的一个控制寄存器!
CR0寄存器,主要用于控制和配置处理器的操作模式和特性!
除了CR0寄存器,还有一个非常重要的寄存器,你需要知道,那就是,CR3寄存器!
CR3寄存器,又被称为“页目录基址寄存器“,如果想从虚拟地址转换为物理地址,CR3寄存器扮演着重要的角色!
当CPU(中央处理器)需要访问虚拟内存地址时,CPU(中央处理器)会首先去获取CR3寄存器中存储的页目录基地址!然后,根据这个 页目录基址 去找到对应的页表!之后,再通过页表找到具体的物理页帧地址!这样,就完成了虚拟地址到物理地址的转换过程。
我们需要注意与牢记的是,CR3寄存器中,存储的是物理地址!而不是虚拟地址(线性地址)!
重要的事情说三遍,CR3寄存器中,存储的是物理地址!CR3寄存器中,存储的是物理地址!CR3寄存器中,存储的是物理地址!
CR3寄存器中,存储的是当前进程的页目录基址!
如果切换进程,CR3寄存器的内容,会发生改变,从而切换为新进程的页目录基址!
进程切换,虚拟内存机制发挥的作用,功不可没!借助于虚拟内存的机制,使用相关控制寄存器,如 CR0、CR3、CR2寄存器等,即可完成进程切换工作!
这里,我们新提到了CR2寄存器,它同样是一个非常重要的控制寄存器!
CR2寄存器,用于保存最后一次出现页故障时的虚拟地址(线性地址)!
当CPU(中央处理器)试图去访问一个未被映射到物理内存的虚拟地址(线性地址)时,就会发生页错误!这个时候,CR2寄存器会记录下引发页面访问错误的虚拟地址(线性地址)。
CR2寄存器,使得操作系统能够定位页错误,并对页错误进行处理!
举个例子,当CPU(中央处理器)想要去访问一个未被映射到物理内存的虚拟地址(线性地址)时,会引发页错误!此时,CPU(中央处理器)会将引发错误的虚拟地址(线性地址)保存到CR2寄存器中,并通知操作系统。操作系统随后会捕获这个页错误,并根据CR2寄存器中保存的虚拟地址(线性地址),找到对应的页面并将其从硬盘加载到内存中,从而恢复程序的执行!
需要注意,对于CR0、CR3、CR2等控制寄存器内容的更改,一般是需要在特权级别(如Ring0)模式环境下去进行的!想要操作 控制寄存器 ,你必须拥有足够的权限!
分页机制的四级页表通常包括以下几个级别(注意,页表是一种数据结构):
- 页目录表(Page Directory Table):这是最高级别的页表,它包含了指向下一级页表的指针或页表项的基地址。
- 页中间目录表(Page Middle Directory Table):这是第二级别的页表,它同样包含了指向下一级页表的指针或页表项的基地址。
- 页表(Page Table):这是第三级别的页表,它直接包含了逻辑页号到物理页框号的映射关系。每个页表项都对应一个物理页框。
- (可选的)页内偏移表:在某些实现中,可能还存在更低级别的页表,用于进一步细分页面内的地址映射。但在4级页表的常规实现中,通常不包括这一级。
通过采用4级页表,操作系统可以更有效地管理内存,提高地址映射的效率,并减少页表占用的内存空间。同时,这种分级的方式也使得页表的扩展和修改更加灵活和方便。
以下是页目录表内容的详解:
-
页目录表的作用:
- 页目录表是分级页表结构中的一级,它包含了指向下一级的页中间目录表的条目。
- 通过页目录表,可以有效地将虚拟地址转换为物理地址,并在需要时将相应的页面从硬盘上加载到物理内存之中。
-
页目录表的结构:
- 在x86-64架构中,页目录表通常是一个页大小的内存区域,包含512个8字节的页表条目(Page Table Entry,PTE)。
- 每个页表条目都记录了下一级页中间目录表的信息。
-
页目录表的索引:
- 虚拟地址中的特定部分用于索引页目录表。在四级分页结构中,虚拟地址的高位部分(通常是前9位)用于索引页目录表。
- 通过索引,系统可以找到对应的页表条目,进而获取下一级页表的地址或物理页面的地址。
-
页目录表与页表的关系:
- 页目录表是页表结构中的一级,它指向下一级的页中间目录表。在四级分页模型中,页目录表之后是页中间目录(Page Middle Directory),再之后是页表(Page Table)。
- 每级页表都负责将虚拟地址的一部分映射到物理地址的一部分,通过多级映射,最终实现完整的虚拟地址到物理地址的转换3。
-
页目录表的更新与管理:
- 随着虚拟页面的进出物理内存,页目录表的内容也会不断更新变化。
- 操作系统负责维护页目录表及其下各级页表的内容,确保虚拟地址到物理地址的正确映射。
(未完待续)

2万+

被折叠的 条评论
为什么被折叠?



