- 4.1 80x86 系统寄存器和系统指令
- 4.1.1 标志寄存器
- 4.1.2 内存管理寄存器
- 4.1.3 控制寄存器
- 4.1.4 系统指令
1. 标志寄存器
标志寄存器EFLAGS通常只允许操作系统修改。我们仅对EFLAGS的系统标志进行说明。
(1) TF:位8是跟踪标志(Trap Flag)。设置该位可用为调试操作启动单步执行方式;复位则禁止单步执行。单步执行方式中,处理器在每个指令执行后产生一个调试异常,这样就可以观察执行程序在执行每条指令后的状态。如果程序使用POPF、POPFD或IRET指令设置了TF,那么在随后指令之后处理器就会产生一个调试异常。
(2) IOPL:位12、13是I/O特权级(I/O Privilege Level)字段。该字段指明当前运行程序或任务的I/O特权级IOPL。当前运行程序或任务的CPL必须小于或等于这个IOPL才能访问I/O地址空间。只有当CPL为特权级0时候,程序才能使用POPE或IRET指令修改这个字段。IOPL也是控制对IF标志修改的机制之一。
(3) NT:bit 14 是嵌套任务标志(Nested Task)。 它控制着被终端任务和调用任务之间的链接关系。在使用CALL 指令, 中断或 异常执行任务调用时候,CPU 会设置该flag。 在通过使用IRET 指令从一个任务返回时候,CPU 会检查并修改这个NT flag。 使用POPF/ POPFD 指令也可以修改这个标志,但是在应用程序中改变这个flag的状态会产生不可意料的异常。
(4) RF:bit 16是恢复标志(Resume Flag)。 该flag 用于控制CPU 对断点指令的响应。当设置时,这个flag 会临时禁止断点指令产生的调式异常: 当该flag 复位时候,则断点指令将会产生异常。RF 标志的主要功能是运行在调式异常之后重新执行一条指令。当调试团结使用IRETD 指令返回被中断程序之前,需要设置堆栈上EFLAGS 内存中的RF flag,以防止指令断点造成另一个异常。CPU 会在返回之后自动地清除该flag, 从而再次允许指令断点异常。
(5) VM :bit 17是虚拟8086 模式(Virtual 8086 Mode)标志。当设置该标志时,就开启虚拟-8086方式: 当复位该标志时,则回到保护模式。
2. 内存管理寄存器
详细内容见Computer_Architecture/x86/cpu下内容
处理器提供4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定内存分段管理所用系统表的基地址,如图4-2。处理器为这些寄存器的加载和保存提供了特定指令。系统表作用参见“保护模式内存管理”。
GDTR,LDTR,IDTR和TR 都是段基址寄存器,这些段中含有分段机制的重要信息表。GDTR,IDTR和LDTR 用于寻址存放描述符表的段。TR 用于寻址一个特殊的任务状态段TSS (Task State Segment)。 TSS 段包含着当前执行任务的重要信息。
(1) 全局描述表寄存器 GDTR
用于存放全局描述符表GDT 的32 bit 线性基地址 和 16 bit 表长度值。基地址指定 GDT 表中字节 0 在线性地址空间中的地址,表长度指明GDT 表的字节长度值。
指令LGDT 和SGDT 分别用于加载和保存GDTR 寄存器的内容。 在机器刚加电或CPU复位后,基地址被默认的设置为0,而长度值被设置成0xFFFF. 在保护模式初始化过程必须给GDTR加载一个新值。
(2) 中断描述符表寄存器IDTR
与GDTR的 作用类似,IDTR 寄存器用于存放中断描述表IDT 的32 bit 线性基地址 和 16bit 表长度值。
指令LIDT 和 SIDT 分别用于加载和保存IDTR 寄存器的内容。 在机器刚加电或CPU复位后, 基地址被默认的设置为0,而长度值设置为 0xFFFF。
(3) 局部描述符寄存器LDTR
用于存放局部描述表LDT 的32 bit 线性基地址。 16 bit 段限长和描述符属性值。
指令LLDT 和SLDT 分别用于加载和保存LDTR 寄存器的段描述符部分。包含LDT 表的段必须在GDT 表中有一个段描述符项。 当使用LLDT 指令把还有LDT 表段的选择符加载进LDTR 时, LDT 段描述符的段基地址,段限长度以及描述符属性会被自动地加载到LDTR中,当进行任务切换时候,段选择符 和基地址被默认地设置为0 ,而长度被设置为0xffff。
(4) 任务寄存器TR
用于存放当前任务TSS段的16 bit 段选择符,32 bit 基地址, 16bit 段长度和描述符属性值。它引用GDT 表中的一个TSS 类型的描述符。 指令LTR 和STR 分别用于加载和保存TR 寄存器的段选择符部分。 当使用LTR指令把选择符加载进任务寄存器时候,TSS 描述符中的段基地址,段限长度以及描述符属性会被自动地加载到任务寄存器中。当执行任务切换时,处理器会把新任务TSS的段选择符合段描述符自动地加载进任务寄存器TR 中。
3. 控制寄存器
控制寄存器(CR0, CR1, CR2 和 CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性,见图4-3所示。
CR0 中含有控制处理器操作模式和状态的系统控制状态:
CR1 保留不用;
CR2 含有导致页错误的线性地址。
CR3 中含有页目标表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR (Page Directory Base address Register)。
3.1 CR0 中协处理器控制位
CR0 的 4个bit : 扩展类型位ET、任务切换位TS、仿真位EM和数学存在位MP用于控制80x86 浮点(数学)协处理器的操作。 有关协处理器的详细说明请参见其他资料内容。
CR0的ET bit (标志)用于选择与协处理器进行通信所使用的协议,即指明系统中使用的是80387 还是 80287 协处理器。
TS,MP 和EM bit 用于确定浮点指令或 WAIT 指令是否应该产生一个设备部存在DNA (Device Not Available) 异常。这个异常可以用来仅仅为使用浮点运算的任务保存和恢复浮点寄存器。对于没有使用浮点运算的任务,这样做可以加快它们之间的切换操作。
(1) ET : CR0 的bit 4是扩展类型(Extension Type) 标志。当该标志位1时, 表示指明系统用 80387 协处理器存在,并使用32bit 协处理器协议。 ET =0 指明使用80287 协处理器。 如果仿真位 EM =1, 则该位将被忽略。 在处理器复位操作时,ET bit 会被初始化指明系统中使用的协处理器类型。 如果系统有有80387 ,则ET 被设置为 1,否则如果有一个80287 或没有协处理器,则ET 被设置为0.
(2) TS :CR0 的bit 3 是任务已切换(Task Switched) 标志。 该标志用于推迟保存任务切换时的协处理器内容,直到新任务开始实际执行协处理器指令。处理器在每次任务切换时都会设置该标志,并且在执行协处理器指令时测试该flag。如果这是了TS 标志并且CR0 的EM 标志位 0, 那么在执行任何协处理器指令之前会产生一个设备不存在DNA (Device Not Available)异常。
如果设置了TS 但没有设置CR0 的MP 和EM 标志,那么在执行协处理器指令 WAIT /FWAIT 之前不会产生设备不存在异常。如果设置了EM 标志,那么TS 标志对协处理器指令的执行无影响,见表4-1
在任务切换时,处理器并不自动保存协处理器的上下文,但是会设置TS标志。这个标志会使得处理器在执行新任务指令流的任何时候遇到一条协处理器指令时产生设备不存在异常。设备不存在异常的处理程序可使CLTS指令清除TS标志,并且保存协处理器的上下文。如果任务从没有使用过协处理器,那么相应协处理器上下文就不用保存。
(3) EM : CR0 的bit 2是仿真标志(EMulation)。 当该bit 设置时候,表示处理器没有内部或外部协处理器,执行协处理器指令时会引起设备不存在异常; 当清除时,表示系统有协处理器。设置这个flag 可以迫使所有浮点指令使用软件来模拟。
(4)MP : CR0 的bit 1是监控协处理器标志(Monitor )。用于控制WAIT /FWAIT 指令与TS标志的交互作用。 如果MP=1、TS =1,那么只需WAIT 指令将产生一个设备不存在异常; 如果MP =0, 则TS 标志不会影响WAIT 的执行。
3.2 CR0 中保护控制bit
(1) PE : CR0 的bit 0 是启用保护(Protection Enable)模式标志。当设置该bit时即开启了保护模式: 当复位时即进入了实模式。这个标志仅仅开启段级保护,而并没有启用分页机制。如果要启用分页机制,那么PE 和PG标志都要置位。
(2) PG : CR0 的bit 31 是分页(Paging)标志。当设置该位时即开启了分页机制; 当复位时则禁止分页机制,此时所有线性地址等同于物理地址。 在开启这个标志之前必须已经或者同时开启PE 标志。即若要启用分页机制,那么PE 和PG 标志都要置位。
(3) WP :对于Intel 80486或者以上的CPU, CR0 的位 16 是写保护(Write Protect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级 0 -》R0 的程序)向用户级只读页面执行写操作;当该位复位时则反之。该标志有利于UNIX 类操作系统在创建进程时实现写时复制(Copy on Write) 技术。
(4) NE : 对于Intel 80486 或以上的CPU,CR0 的bit 5 是协处理器错误(Numerical Error)标志。当设置该标志时,就启用了 x87 协处理器错误的内部报告机制;若复位该标志,那么就使用PC 机形式的x87 协处理器错误报告机制。
启动保护模式 PE (0 bit) 和开启分页PG(bit 31)分别用于控制分段和分页机制。
PE用于控制分段机制。
-
如果PE =1,处理器就工作在开启分段机制环境下, 即运行在保护模式下;
-
如果PE =0,则处理器关闭了分段机制,并如同8086 工作于实模式下。
PG 用于控制分页机制。
-
如果PG =1,则开启了分页机制。
-
如果PG =0,分页机制被禁止,此时线性被直接作为物理地址使用。
如果PE=0,PG=0 ,处理器工作在实地址模式下;
如果PE=1,PG=0,处理器工作在没有开启分页机制的保护模式下;
如果PE=0,PG=1。此时由于不在保护模式下不能启用分页机制,因此处理器会产生一个一般保护异常,即这种标志组合无效;
如果PG=1, PE =1,则处理器工作在开启了分页机制的保护模式下。
当改变PE 和PG bit 时,必须小心。
只有当执行程序起码有部分代码和数据在线性地址空间和物理地址中具有相同地址时,我们才能改变PG位的设置。此时这部分具有相同地址的代码在分页和未分页世界之间起着桥梁的作用。无论是否开启分页机制,这部分代码都具有相同的地址 。另外,在开启分页(PG=1) 之前必须先刷新CPU 中的页高速缓冲(或称为转换查找缓冲区 TLB - translation Lookaside Buffers)。
在修改了PE 位之后程序必须要立刻使用一条跳转指令,以刷新处理器执行管道中已经获取的不同模式下的任何指令。在设置PE bit 之前,程序必须初始化几个系统段和控制寄存器。在系统刚上电时,处理器 被复位成 PE =0 、PG = 0(即实模式状态),以允许引导代码在启用分段和分页机制之前能够初始化这些寄存器和数据结构。
3.3 CR2和CR3
CR2 和CR3 用于分页机制。
CR3 含有存放页目录表页面的物理地址,因此CR3 也被称为PDBR。 因为页目录页面是页对齐的,所以该寄存器只有高20 bit 是有效的。而低12bit 保留提供给更高级处理器使用,因此在往CR3 中加载一个新值时低 12 bit 必须设置为 0. 使用MOV 指令加载CR3 时具有让页告诉缓冲无效的副作用。为了减少地址转换所要求的总线周期数量,最近访问的页目录和页表会被存放在处理器的页高速缓冲器件中,该缓冲器被称为转换查找缓冲区TLB (Translation Lookside Buffer)。只有当TLB 中不包含要求的页表项时才会使用额外的总线周期从内存中读取页表项。 即使CR0 中的PG 位于复位状态 (PG =0),我们也能先加载CR3. 以允许对分页机制进行初始化。当切换任务时,CR3 的内容也会随之改变。 但是如果新任务的CR3 值与原任务的一样,处理器就无需刷新高速缓冲。这样共享页表的任务可以执行得更快。
CR2 用于出现页异常报告出错信息。在报告异常时,处理器会把引起异常的线性地址存放在CR2 中。因此操作系统中的页异常处理程序可以通过检查CR2 的内容来确定线性地址空间中的哪一个页面引发了异常。
4. 系统指令
系统指令用于处理系统级别功能,例如加载系统寄存器,管理中断等。多数系统指令只能由处于特权级0的操作系统软件执行,其余一些指令可以在任何特权级上执行,因此应用程序也能使用,表4-2 中列出了我们将用到的一些系统指令,其中还指出了它们是否受到保护。