浅析Intel处理器体系结构:CPU运行模式

文章目录

    • CPU运行模式
      • 模式转换示意
    • 系统上电时的模式切换
      • 从实模式切换到保护模式
        • A20功能
          • 开启A20功能
        • 系统数据准备
        • 模式切换流程
      • 从保护模式切换到长模式
        • 系统数据准备
        • 模式切换流程
    • 相关参考

CPU运行模式

IA-32处理器有三种基本的操作模式:实地址模式、保护模式和系统管理模式。另外一种模式称为虚拟8086模式,是保护模式的一个特例:

  • 实地址模式:早期Intel 8086处理器的运行模式,只支持16位,通过使用段+偏移地址的寻址方式,最大可寻址1M的内存。实地址模式下,允许程序不加限制地访问内存空间的任意位置,因此是极不安全的;
  • 保护模式:保护模式是处理器的基本模式,在保护模式下,所有指令和特性都是可用的,程序被赋予了独立的内存区域(段),处理器阻止程序访问已分配段之外的其它内存;
  • 系统管理模式:系统管理模式为操作系统提供了用以实现电源管理和系统安全等功能的机制;
  • 虚拟8086模式:在保护模式下,处理器可以在安全的多任务环境中执行实地址模式的软件;

Intel 64位处理器架构下新增了一种新的操作模式,称作IA-32e模式,是64位处理器的主要运行模式。IA-32e模式下,处理器支持两种子模式:Compatibility模式和64位模式:

  • Compatibility模式下支持运行大部分传统的保护模式应用;
  • 64位模式下支持64位长的线性地址空间。

模式转换示意

Intel处理器各个运行模式间切换过程示意如下:

系统上电时的模式切换

由于历史原因,Intel处理器的开发和演进一直在保持着向后兼容,即使当下我们已经在使用x86_64的架构,但在PC开机上电时,处理器仍然需要先运行在16位的实地址模式下,然后切换到32位保护模式,最后才能切换到64位模式(IA-32e模式,也称作长模式)下运行。

从实模式切换到保护模式

Intel处理器的保护模式提供了诸多新机制,包括全新的分段机制、分页机制以及保护机制等,这些机制涉及到一些关键的系统数据结构,如GDT、IDT、TSS以及页表等,因此,处理器在切换到保护模式前,系统编程人员必须准备好相关的数据结构,然后按照Intel官方手册规定的步骤进行操作。

A20功能

早期8086处理器只有20根地址线,因此只能寻址1MB以内的地址空间。随着处理器寻址能力的不断增强,处理器开始逐步支持32位以至64位寻址。为了保证硬件平台的向后兼容性,硬件设计人员利用了当时8042键盘控制器上一个空闲的端口引脚,来控制开启或禁止1MB以上地址空间,即A20地址线功能。当A20地址线引脚位低电平时,那么只有低20位地址有效,其它位均为0。

开启A20功能

在计算机上电时,A20地址线默认是被禁用的,为了切换到32位寻址,必须要先开启A20地址线。开启A20地址线的方法有多种,最常见的是通过操作IO端口92h来控制开启A20地址线。汇编代码如下:

in al, 0x92
or al, 2
out 0x92, al

系统数据准备

为了进入保护模式,必须在模式切换前,准备好必要的系统数据结构,包括全局描述符表GDT、中断描述符表IDT、任务状态段TSS结构以及初始页表结构。

  • 全局描述符表GDT:系统进入保护模式前,必须准备至少一个代码段描述符和数据段描述符,其中GDT的第一项描述符必须为空;
  • 中断描述符表IDT
  • 任务状态段TSS
  • 分页机制:如果希望开启分页机制,则必须准备至少一个页目录项和页表项。

模式切换流程

Intel官方手册描述了从实地址模式切换到保护模式的操作步骤,如下:

  1. 执行CLI指令禁止可屏蔽硬件中断;
  2. 执行LGDT指令将GDT的基地址和长度加载到GDTR;
  3. 执行MOV CR0指令设置CR0控制寄存器的PE标志位,开启保护模式;如果开启分页机制,同时置位PG标志位;
  4. 执行远跳转或远调用指令,切换到保护模式的代码段执行;
  5. 执行LTR指令加载TSS段描述符段选择子;
  6. 重新加载数据段寄存器。对于不使用的数据段寄存器,可以将GDT的第一个空描述符选择子加载到其中;
  7. 执行LIDT指令加载IDT的基地址和长度;
  8. 执行STI指令使能可屏蔽硬件中断

从保护模式切换到长模式

在进入长模式前,处理器依然要提前准备必要的系统数据结构以及配置相关控制寄存器,并且Intel手册要求必须要从保护模式切换到长模式。

系统数据准备

模式切换流程

IA-32e模式的标准初始化步骤如下:

  1. 在保护模式下,执行MOV CR0指令复位CR0寄存器的PG标志位,关闭分页机制;
  2. 置位CR4寄存器的PAE标志位,开启物理地址扩展功能;
  3. 加载页目录的物理基地址到CR3寄存器中;
  4. 置位IA32_EFER寄存器的LME标志位,开启IA-32e模式;
  5. 置位CR0控制寄存器的PG标志位开启分页机制,此时处理器会自动置位IA32_ERER寄存器的LMA标志位。

相关参考

  • 《Intel处理器手册》
  • 《一个64位操作系统的设计与实现》
  • 《x86_64体系结构探索与编程》

你可能感兴趣的:(#,Intel体系结构,服务器,处理器,x86)