CF 进位标志
PF 奇偶标志
ZF 零标志
SF 符号标志
OF 补码溢出标志
TF 跟踪标志
IF 中断标志
······
文章插图
在x64架构下,原来的eflags寄存器升级为64位的rflags,不过其高32位并没有新增什么功能,保留为将来使用 。
指令寄存器
eip: 指令寄存器可以说是CPU中最最重要的寄存器了,它指向了下一条要执行的指令所存放的地址,CPU的工作其实就是不断取出它指向的指令,然后执行这条指令,同时指令寄存器继续指向下面一条指令,如此不断重复,这就是CPU工作的基本日常 。而在漏洞攻击中,黑客想尽办法费尽心机都想要修改指令寄存器的地址,从而能够执行恶意代码 。
同样的,在x64架构下,32位的eip升级为64位的rip寄存器 。
段寄存器段寄存器与CPU的内存寻址技术紧密相关 。
早在16位的8086CPU时代,内存资源宝贵,CPU使用分段式内存寻址技术:
文章插图
16位的寄存器能寻址的范围是64KB,通过引入段的概念,将内存空间划分为不同的区域:分段,通过段基址+段内偏移段方式来寻址 。
这样一来,段的基地址保存在哪里呢?8086CPU专门设置了几个段寄存器用来保存段的基地址,这就是段寄存器段的由来 。
段寄存器也是16位的 。
段寄存器有下面6个,前面4个是早期16位模式就引入了,到了32位时代,又新增了fs和gs两个段寄存器 。
cs: 代码段段寄存器里面存储的内容与CPU当前工作的内存寻址模式紧密相关 。
ds: 数据段
ss: 栈段
es: 扩展段
fs: 数据段
gs: 数据段
当CPU处于16位实地址模式下时,段寄存器存储段的基地址,寻址时,将段寄存器内容左移4位(乘以16)得到段基地址+段内偏移得到最终的地址 。
当CPU工作于保护模式下,段寄存器存储的内容不再是段基址了,此时的段寄存器中存放的是段选择子,用来指示当前这个段寄存器“指向”的是哪个分段 。
注意我这里的指向打了引号,段寄存器中存储的并不是内存段的直接地址,而是段选择子,它的结构如下:
文章插图
16个bit长度的段寄存器内容划分了三个字段:
PRL: 特权请求级,就是我们常说的ring0-ring3四个特权级 。这里提到了两个表,全局描述符表GDT和局部描述符表LDT,关于这两个表的介绍,下面介绍描述符寄存器时再详述,这里只需要知道,这是CPU支持分段式内存管理需要的表格,放在内存中,表格中的每一项都是一个描述符,记录了一个内存分段的信息 。
TI: 0表示用的是全局描述符表GDT,1表示使用的是局部描述符表LDT 。
Index: 这是一个表格中表项的索引值,这个表格叫内存描述符表,它的每一个表项都描述了一个内存分段 。
保护模式下的段寄存器和段描述符到最后的内存分段,通过下图的方式联系在一起:
文章插图
推荐阅读
- 运动|“长期化妆”和“长期素颜”,5年后皮肤有什么区别?看完你就懂
- 京东|京东为守护地球做了哪些贡献?看完我沉默了
- IOS 14“资源库”详解 看完再也不会迷失App图标
- Win10系统重置和重装区别这么大,不说不知道!看完别乱操作
- 外星人|美国放出UFO最新调查报告 看完脑洞裂开:各种超自然技术
- 发型|?“化妆、发型”对女人来说有多重要?看完这些对比照后,我悟了
- 亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行
- 互联网大厂的负载均衡和高可用是怎么做的,看完这篇你就懂了
- 显卡|装电脑多花2000上水冷就是交智商税?看完恍然大悟
- 8种ETL调度算法归纳总结,看完这些你就全明白了