一口气看完45个寄存器,CPU核心技术大揭秘( 二 )


CF 进位标志
PF 奇偶标志
ZF 零标志
SF 符号标志
OF 补码溢出标志
TF 跟踪标志
IF 中断标志
······

一口气看完45个寄存器,CPU核心技术大揭秘

文章插图
 
在x64架构下,原来的eflags寄存器升级为64位的rflags,不过其高32位并没有新增什么功能,保留为将来使用 。
指令寄存器
eip: 指令寄存器可以说是CPU中最最重要的寄存器了,它指向了下一条要执行的指令所存放的地址,CPU的工作其实就是不断取出它指向的指令,然后执行这条指令,同时指令寄存器继续指向下面一条指令,如此不断重复,这就是CPU工作的基本日常 。
而在漏洞攻击中,黑客想尽办法费尽心机都想要修改指令寄存器的地址,从而能够执行恶意代码 。
同样的,在x64架构下,32位的eip升级为64位的rip寄存器 。
段寄存器段寄存器与CPU的内存寻址技术紧密相关 。
早在16位的8086CPU时代,内存资源宝贵,CPU使用分段式内存寻址技术:
一口气看完45个寄存器,CPU核心技术大揭秘

文章插图
 
16位的寄存器能寻址的范围是64KB,通过引入段的概念,将内存空间划分为不同的区域:分段,通过段基址+段内偏移段方式来寻址 。
这样一来,段的基地址保存在哪里呢?8086CPU专门设置了几个段寄存器用来保存段的基地址,这就是段寄存器段的由来 。
段寄存器也是16位的 。
段寄存器有下面6个,前面4个是早期16位模式就引入了,到了32位时代,又新增了fs和gs两个段寄存器 。
cs: 代码段
ds: 数据段
ss: 栈段
es: 扩展段
fs: 数据段
gs: 数据段
段寄存器里面存储的内容与CPU当前工作的内存寻址模式紧密相关 。
当CPU处于16位实地址模式下时,段寄存器存储段的基地址,寻址时,将段寄存器内容左移4位(乘以16)得到段基地址+段内偏移得到最终的地址 。
当CPU工作于保护模式下,段寄存器存储的内容不再是段基址了,此时的段寄存器中存放的是段选择子,用来指示当前这个段寄存器“指向”的是哪个分段 。
注意我这里的指向打了引号,段寄存器中存储的并不是内存段的直接地址,而是段选择子,它的结构如下:
一口气看完45个寄存器,CPU核心技术大揭秘

文章插图
 
16个bit长度的段寄存器内容划分了三个字段:
PRL: 特权请求级,就是我们常说的ring0-ring3四个特权级 。
TI: 0表示用的是全局描述符表GDT,1表示使用的是局部描述符表LDT 。
Index: 这是一个表格中表项的索引值,这个表格叫内存描述符表,它的每一个表项都描述了一个内存分段 。
这里提到了两个表,全局描述符表GDT和局部描述符表LDT,关于这两个表的介绍,下面介绍描述符寄存器时再详述,这里只需要知道,这是CPU支持分段式内存管理需要的表格,放在内存中,表格中的每一项都是一个描述符,记录了一个内存分段的信息 。
保护模式下的段寄存器和段描述符到最后的内存分段,通过下图的方式联系在一起:
一口气看完45个寄存器,CPU核心技术大揭秘

文章插图
 


推荐阅读