美文网首页
CPU工作模式

CPU工作模式

作者: 一生逍遥一生 | 来源:发表于2021-11-22 19:46 被阅读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段寄存器,刷新其影子寄存器。

    相关文章

      网友评论

          本文标题:CPU工作模式

          本文链接:https://www.haomeiwen.com/subject/tajetrtx.html