CPU工作模式
实模式分为两个方面:运行真实的指令,对指令的动作不做区分,直接执行指令的真实功能;发往内存的地址是真实的,对任何地址不加限制地发往内存。
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段寄存器,刷新其影子寄存器。