【Linux 0.12】80x86保护模式——系统寄存器和系统指令

  • [x] 什么是虚拟8086方式和保护模式?(EFLAGS的 VM标志位)
  • [x] 如何理解,不开启分页,则线性地址等价于物理地址?

80x86保护模式及其编程

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

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

EFLAGS

img

(通用标志略过——CF:进位,PF:奇偶,AF:辅助进位,ZF:零标志,SF:负号,DF:方向,OF:溢出)

  • TF(Trap Flag):跟踪标志,设置该位时,为调试操作启动单步执行方式。单步执行时,处理器在每个指令执行之后产生一个调试异常
  • IOPL(IO Privileged Level):指明当前程序或任务的IO特权级,当前运行程序或任务的CPL(Current Privileged Level) 小于IOPL,才可以访问IO地址空间。只有CPL=0时,程序才能使用POPF等指令修改IOPL字段。
  • NT(Nested Task):嵌套任务标志。控制被中断任务调用任务之间的链接关系。使用Call指令、中断、或异常执行任务调用时,处理器设置该标志;在通过IRET指令从一个任务返回时,处理器修改并返回NT标志。
  • RF(Resume Flag):恢复标志。控制处理器对断点指令的响应。设置时会临时禁止断点指令产生的调试异常;RF标志位的主要功能时允许调试异常发生之后,重新执行一条指令。当调试软件使用IRETD指令返回被中断的程序之前,需要设置RF标志,防止该指令造成另外一个异常。处理器会在该指令返回之后,自动复位RF。
  • VM(Virtual 8086 Mode):虚拟8086方式,设置时开启虚拟8086方式,否则回到保护模式

内存管理寄存器

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

img

GDTR,LDTR,IDTR,和TR都是 段基址寄存器,这些段中含有分段机制的重要信息表。GDTR,LDTR,IDTR用于寻址存放描述符的段,TR用于寻址特殊的任务状态段(Task State Segment, TSS),TSS包含当前执行任务的重要信息。

GDTR 全局描述符表寄存器

存放全局描述符表 GDT 的32位线性基地址和16位的表限长值。基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。

指令LGDT 和 SGDT 分别用于加载和保存GDTR的内容。

在机器刚通电或处理器复位之后,基地址设置为0,长度设置为0xFFFF。

在保护模式初始化过程中,必须给GDTR 加载一个新的值。

IDTR 中断描述符表寄存器

与GDTR作用类似,基地址指定IDT表中字节0在线性地址空间中的地址,表长度指明IDT表的字节长度值。

指令LIDT 和 SIDT 分别用于加载和保存IDTR的内容。

LDTR 局部描述符表寄存器

LDTR寄存器用于存放局部描述符表LDT的32位线性基地址,16位的段限长,以及描述符属性值。

指令LLDT和SLDT 分别用于加载和保存LDTR的内容。

当进行任务切换的时候,处理器会把新任务的LDT的段选择符和段描述符自动加载到LDTR中。

任务寄存器TR

任务切换时,处理器会把新任务的TSS的段选择符和段描述符自动加载进人物寄存器TR中。

控制寄存器 CR0~CR3

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

参考(Pentium又增加了1个控制寄存器CR4,无视就好= =)

1564568247002

  • CR0:含有控制处理器操作模式和状态的系统控制标志;
  • CR1:保留不用;
  • CR2:含有导致页错误的线性地址
  • CR3:含有页目录表物理内存基地址,也称为页目录基地址寄存器PDBR

CR0 中协处理器控制位

ET扩展类型位,TS任务切换位,EM仿真位,MP数学存在位 用于控制80x86浮点(数学)协处理器的操作。ET用于指明使用80287还是80387协处理器。

协处理器,这是一种协助中央处理器完成其无法执行或执行效率、效果低下的处理工作而开发和应用的处理器。这种中央处理器无法执行的工作有很多,比如设备间的信号传输、接入设备的管理等;而执行效率、效果低下的有图形处理、声频处理等。为了进行这些处理,各种辅助处理器就诞生了。

具体细节不表。用到再查,我也不关心协处理器。

CR0 中的保护控制位

  • PE: Protection Enable,启用保护标志。设置该位时即开启了保护模式(内存分段)。复位时立即进入实地址模式。如果要启用分页机制,PE和PG都要设置。

CPU复位(reset)或加电(power on)的时候以实模式启动,处理器以实模式工作。在实模式下,内存寻址方式和8086相同,由16位段寄存器的内容乘以16(10H)当做段基地址,加上16位偏移地址形成20位的物理地址,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。在实模式下,所有的段都是可以读、写和可执行的。

  • PG: Paging 分页标志。表示是否开启分页机制。如果禁止,则所有的线性地址等同于物理地址。
  • WP: Write Protect写保护标志。设置该标志时,禁止超级用户程序(CPL=0)向用户级的只读页面执行写操作。有利于Unix类操作系统在创建进程时实现写时复制技术。
  • NE: Numeric Error 协处理器错误。

PE和PG分别控制分段和分页。

PE=1,则工作于开启分段机制的环境下,即 保护模式

PE=0,则如同8086工作于实地址模式下

PG=1,则开启分段机制

PG=0,线性地址被直接作为物理地址使用

若PE=0,PG=0,处于实地址状态

若PE=0,PG=1,无效,只有开启了PE才能开启PG

CR2 和 CR3

CR2 和 CR3 用于分页机制。

CR3 存放页目录表页面的物理地址,因此也被称为PDBR。由于页目录表页面时页对齐的,所以该寄存器只有高20位是有效的。而低12位保留供高级处理器使用。

使用MOV指令加载CR3时具有让页高速缓冲无效的副作用。为了减少地址转换所要求的总线周期数量,最近访问的也目录和页表会被存放在处理器的页高速缓冲器件中。该缓冲器被称为转换查找缓冲区(TLB,Translation Lookaside Buffer)。只有TLB不包含要求的页表项时,才会使用额外的总线周期从内存读取页表项。

页高速缓存:Linux内核实现磁盘缓存的技术就叫页高速缓存。即把磁盘中的数据缓存到物理内存中,把对磁盘的访问转换为对物理内存的访问。

CR2用于出现页异常时报告出错信息。在报告页异常时,处理器会把引起异常的线性地址存放在CR2。