CPU工作模式

2021-11-22  本文已影响0人  一生逍遥一生

实模式分为两个方面:运行真实的指令,对指令的动作不做区分,直接执行指令的真实功能;发往内存的地址是真实的,对任何地址不加限制地发往内存。
x86 CPU下在实模式下的寄存器。

寄存器 描述
AX、BX、CX、DX、DI、SI、BP 通用寄存器,里面可以寄存数据、地址、参与运算
IP 程序指针寄存器,始终指向下一条指令的地址
SP 栈指针地址寄存器,始终指向当前栈顶
CS、DS、ES、SS 段寄存器,里面存放一个内存段的基地址
FLAGS CPU标志寄存器,里面存放CPU执行运算指令产生的状态位

代码段是由CS和IP确定的,栈段是由SS和SP段确定的。

实模式中断是如何产生的:

  • 中断寄存器给CPU发送了一个电子信号,CPU会对这个信号作出应答。随后中断控制会将中断号发送给CPU,这是硬件中断。
  • CPU执行了INT指令,这个指令后面会跟随一个常数,这个常数即是软中断信号。

为了实现中断, 需要在内存中放一个中断向量表,这个表的地址和长度由CPU的特定寄存器IDTR指向。

保护模式寄存器

寄存器 描述
EAX、EBX、ECX、EDX、EDI、ESI、EBP 32位通用寄存器,里面可以存放数据、地址、参与运算
EIP 32位程序指针寄存器,始终指向下一条指令的地址
ESP 栈指针寄存器,始终指当前栈顶
CS、DS、ES、SS、FS、GS 16位段寄存器,里面存放一个内存段的描述符索引
EFLAGS 32位CPU标志寄存器,里面存放CPU执行运算指令产生的状态位
CR0、CR1、CR2、CR3 32位CPU控制器,控制CPU的功能控制特性,如开启保护模式等

特权等级分为4级,R0~R3,每个特权级执行指令的数量不同,R0可以执行所有指令,R1、R2、R3依次递减。
段寄存器中不再包含段基地址,而是具体段描述符的索引,访问一个内存地址时,段寄存器中的索引首先会结合GDTR寄存器找到内存中的段描述符,在根据其中的段信息判断能不能访问成功。
通常情况下,CS和SS中RPL就组成了CPL(当前权限级别),只有CPL小于等于目标段DPL时才能访问。
X86 CPU并不能直接使用分页模型,而是要在分段模式的前提下,根据需要决定是否要开启分页。
保护模式下的中断要权限检查, 还有特权级的切换,所以需要权限终端向量表的信息。

产生中断的过程:

*产生中断后,CPU首先会检查中断号是否大于最后一个终端门描述符;
*检查中断门描述符中的段选择子指向的段描述符;
*权限检查:如果CPL小于等于中断门的DPL,并且CPL大于等于中断门的段选择子所指向的段描述符的DPL,就指向段描述符的DPL;

切换到保护模式的步骤:

*准备全局段描述符表

  • 加载设置GDTR寄存器, 使之指向全局段描述符表
  • 设置CR0寄存器,开启保护模式。
  • 进行长跳转,家在CS段寄存器

长模式相对于保护模式,增加一些通用寄存器,并扩展通用寄存器的位宽,所有的通用寄存器都是64位,还可以单独使用低32位。

寄存器 描述
RAX、RBX、RCX、RDX、RDI、DSI、RBP、R8~R15 64位通用寄存器,里面可以存放数据、地址、参与运算
RIP 64位程序指针寄存器,始终指向下一条指令的地址
RSP 栈指针寄存器,始终指向当前栈顶
CS、DS、ES、SS、FS、GS 16位段寄存器,里面存放一个内存段的描述符索引
RFLAGS 64位CPU标志寄存器,里面存放CPU执行运算指令产生的状态位
CR0,CR1,CR2,CR3,CR4 除了CR仍是32位CPU控制寄存器,控制CPU的功能控制特性,其他都是64位寄存器

当描述符中的L=1,D/B=0时,就是64位代码段,DPL还是0~3的特权级。然后有多个段描述在内存中形成一个全局段描述符表,同样由CPU的GDTR寄存器指向。

保护模式下为了实现对中断进行权限检查,实现了中断门描述符,在中断门描述符中存放了对应的段选择子和其段内偏移,还有DPL权限,如果权限检查通过,则用对应的段选择子和其段内偏移装载CS:EIP寄存器

长模式下中断门描述符的格式变化:

  • 为了支持64位寻址中断门描述符在原有基础上增加8字节,用于存放目标段偏移的高32位值。
  • 目标代码段选择子对应的代码段描述符必须是64位的代码段。
  • IST是64位TSS中的IST指针。

切换到厂模式下的步骤:

  • 准备长模式全局段描述符表
  • 准备长模式下的MMU页表,这是为了开启分页模式,切换到厂模式下必须要开启分页,MMU依赖页表对地址进行转换,页表有特定的格式存放在内存中 ,其地址由CPU的CR3寄存器指向
  • 加载GDTR寄存器 ,使之指向全局段描述表
  • 开启场模式 ,要同时开启保护模式和分页模式。在实现长模式时定义了MSR寄存器,需要用专用的指令rdmsr、wrmsr进行读写,IA32_EFER寄存器的地址为0xC0000080,它的第8位决定了是否开启场模式。
  • 进行跳转,加载CS段寄存器,刷新其影子寄存器。
上一篇下一篇

猜你喜欢

热点阅读