Linux-0-11-80x86保护模式及其编程

80x86 系统寄存器和系统指令

为了协助CPU执行初始化和控制系统操作,80x86提供了一个标志寄存器EFLAGS和几个系统寄存器,除了一些通用状态标志外,
EFLAGS还包含了几个系统标志。这些系统标志用于控制任务切换、中断处理、指令跟踪以及权限访问。系统寄存器用于内存管理、控制处理器操作、
含有分段和分页处理机制系统表的基地址、控制处理器操作的比特标志位。

eflags 寄存器

内存管理寄存器

处理器提供了4个内存管理寄存器,分别是GDTR、LDTR、IDTR和TR。用于指定分段内存管理所使用的系统表的基地址。

上述4个寄存器都是段基地址寄存器,这些段含有分段机制的重要信息表。GDTR、LDTR、IDTR是用于存放描述符表的段。TR用于寻找一个特殊的任务状态段TSS(task state segment)。TSS段包含着当前执行任务的重要信息。

  1. 全局描述符表寄存器GDTR。32位基地址+16位表长度。LGDT和SGDT分别用于加载和保存GDTR的值。机器刚加电时候,基地址默认为0,长度值默认为0xFFFF。在保护模式初始化过程中必须给 GDTR加载一个新值。
  2. 中断描述符表寄存器IDTR。与GDTR类似。
  3. 局部描述符表寄存器LDTR。32位基地址+16位(段限长和描述符属性值)
  4. 任务寄存器TR。

控制寄存器

控制寄存器用于控制盒确定处理器操作模式以及当前执行任务的特性。

保护模式内存管理

内存寻址

80x86提供了6个存放段选择符的段寄存器:CS、DS、SS、ES、FS、GS。

  1. 其中CS总是用于寻址代码段、而SS总是用于堆栈段。在任何时刻由CS寻址的段称为当前代码段。此时EIP寄存器中包含了当前代码段内下一条要执行的指令的段内偏移地址。因此要执行的指令地址可比表示为CS:[EIP]。
  2. 由段寄存器SS寻址的段成为当前堆栈段。栈顶由ESP寄存器内容指定,当前堆栈顶处于地址SS:[ESP]。帧底地址为SS:[EBP]。

地址变换

分段机制

段选择符、段描述符表、段描述符、段基地址、偏移量

分页机制

保护

  1. 任务间保护
  2. 特权级保护

分段机制

  1. 段的定义。段基地址+段限长+段属性。以上组成了段描述符
  2. 段描述符。同上。使用段选择符在段描述符表中定位段描述符。得到段基地址。加上偏移量得到线性地址。
  3. 段描述符表。GDT和LDT。存放段描述符的数组。
  4. 段选择符。描述符索引+TI+RPL。代码段描述符、数据段描述符、系统描述符
  5. 系统描述符。
    1. 局部描述符表的段描述符
    2. 任务状态段描述符
    3. 调用们描述符
    4. 中断门描述符
    5. 陷阱门描述符
    6. 任务门描述符

略。

任务管理

任务是处理器可以被分配调度、执行和挂起的一个工作单元。80x86提供了一种机制,这种机制可以用来保存任务的状态、分派任务执行以及从一个任务切换到另一个任务。当工作在保护模式下,处理器所有运行都在任务中。

80x86提供了多任务的硬件支持。任务是一个正在运行的程序,或者是一个等待准备运行的程序。通过中断、异常、 跳转或调用,我们可以执行一个任务。

任务切换和过程调用类似,但任务切换会保存更多的寄存器信息。这些信息被保存在TSS中。

任务的结构和状态

任务有由任务执行空间和任务状态段组成。任务执行空间包括代码段、堆栈段和一个或者多个数据段。TSS指定了构成任务执行空间的各个段。

一个任务用指向其TSS的段选择符来指定。当一个任务被加载进处理器中执行时,那么该任务的段选择符、基地址、段限长以及TSS段描述符都会被加载到任务寄存器TR中。