Intel处理器手册系统编程指南第2章(2)

2.2 操作模式

IA-32支持三种操作模式和一种准操作模式:

  • 保护模式(Protected Mode)——这是IA-32处理器“天生的”操作模式。它提供了丰富的一系列架构特性、灵活性、高性能和对已有软件基础的向后兼容性。
  • 实模式(Real Mode)——这个操作模式提供Intel8086处理器的编程环境,但有少量拓展(例如切换到保护模式或系统管理模式的功能)。
  • 系统管理模式(System Management Mode,SMM)——SMM是从Intel386 SL以来所有IA-32处理器的一个标准架构特性。这个模式为操作系统和其他一些程序提供实现电源管理和OEM差异特性的透明机制。要进入SMM模式,要激活一个外部的系统中断管脚(SMI#)从而产生一个系统管理中断(SMI)。在SMM模式中,处理器保存当前运行的程序或任务的内容,并且切换到一个独立的地址空间。针对SMM的代码会被透明地执行。从SMM返回时,处理器会恢复系统管理中断前的状态。
  • 虚拟8086模式(Virtual-8086Mode)——在保护模式中,处理器支持一种准操作模式叫做虚拟8086模式。这个模式允许处理器在一个受保护的多任务的环境中运行8086的软件。

Intel 64架构支持IA-32的所有操作模式和IA-32e模式:

  • IA-32e模式——在IA-32e模式中,处理器支持两个子模式:兼容模式和64位模式。64位模式提供64位的线性寻址并支持大于64 GBytes的物理地址空间。

图2-3展示了处理器如何在不同操作模式间切换。

在加电启动或复位之后,处理器会处于实模式。控制寄存器CR0的PE标志位会控制处理器运行在实模式还是保护模式。请参考:9.9《模式转换》和4.1.2《开启分页模式》。

EFLAGS寄存器中的VM标志位决定处理器运行在保护模式还是虚拟8086模式。保护模式和虚拟8086模式之间的转换一般是通过一个任务切换或者从中断或异常处理返回而执行的。请参考20.2.5《进入虚拟8086模式》。

LMA位(IA32_EFER.LMA[bit10])决定处理器是否工作在IA-32e模式。在IA-32e模式中,代码段的CS.L位决定运行在64位模式还是兼容模式。要处理器进入IA-32e模式,开启分页并将LME位(IA32_EFER.LME[bit 8])设1。请参考第9章《处理器管理和初始化》。

无论在实模式、保护模式、虚拟8086模式还是IA-32e模式,处理器在接收到一个SMI时都会切换到SMM模式。当执行RSM指令时,处理器总是回到SMI执行前的模式。


图2-3、不同操作模式间的切换

2.3 EFLAGS寄存器中的系统标志和位域

EFLAGS寄存器的系统标志和IOPL位域控制I/O、可屏蔽硬件中断、调试、任务切换和虚拟8086模式(请见图2-4)。只有特权代码(通常是操作系统)可以修改这些位。

图2-4、EFLAGS寄存器中的系统标志

这些系统标志是:

TF

陷阱(Trap,bit 8)——设1则允许调试的单步运行;清0则不允许单步模式。在单步模式中,处理器每执行一条指令就产生一个调试中断,这允许人们在程序运行时检查其每一条指令。如果一个程序用POPF、POPFD或IRET指令来将TF设1,调试中断会从POPF、POPFD或IRET指令的紧接着下一条指令的执行后产生。

IF

中断允许(Interrupt,bit 9)——控制处理器是否对可屏蔽硬件中断作出响应(请见:6.3.2《可屏蔽硬件中断》)。设1则响应可屏蔽硬件中断;清0则阻止。IF位不影响异常或不可屏蔽中断(NMI)的产生。CPL、IOPL和控制寄存器CR4的VME位的状态决定IF位是否能被CLI、STI、POPF、POPFD和IRET修改。

IOPL

I/O特权级位域(I/O Privilege Level,bit 12和13)——指示当前运行的程序或任务的I/O特权级。当前运行的程序或任务的CPL必须小于等于IOPL才能访问I/O地址空间。这个位域只能在CPL为0时被POPF和IRET指令修改。

IOPL还是控制IF标志修改,和虚拟模式拓展启用(CR4.VME = 1)时虚拟8086模式中控制中断处理的机制之一。

NT

嵌套任务(Nested Task,bit 14)——控制中断和被调用程序的链条。处理器在遇到由CALL指令、中断或异常而触发的任务调用时,会将此位设1。在遇到由IRET指令触发的从任务返回时,处理器会检查并修改此位。此位可被POPF/POPFD指令显式地修改,但修改此位可能会导致应用程序的不可预测的异常。

请见7.4《任务链接》。

RF

恢复(Resume,bit 16)——此位控制处理器对指令断点条件的反应。设1则暂时屏蔽由指令断点产生的调试异常(#DB)(而其他异常情况可以触发异常)。清0则指令断点可以产生调试异常。

RF标志位的基本功能是,在由指令断点条件引起调试异常后,使紧接着的下一条指令能够执行而不会再次引起调试异常。因此,调试软件在返回被中断程序的IRETD指令之前,要用栈将此位设1,以防指令断点又一次引起调试中断。处理器在成功执行紧接着下一条指令后,会自动将此位清0,重新允许指令断点。

请见17.3.1.1《指令断点异常的条件》。

VM

虚拟8086模式(Virtual-8086 Mode,bit 17)——设1进入虚拟8086模式;清0返回保护模式。

请见20.2.1《开启虚拟8086模式》。

AC

对齐检查(Alignment Check,bit 18)——将此标志位和控制寄存器CR0的AM标志位都设1会开启对内存引用的对齐检查;将AC位和/或AM位清0则关闭对齐检查。当引用一个不对齐的操作数时,例如一个字的地址为奇数或一个双字的地址不是4的整数倍,对齐检查会产生一个对齐检查异常。对齐检查异常只会在用户模式(特权级3)产生。对特权级0的内存引用,例如加载段描述符,不会产生对齐检查异常,即使执行的是用户模式下的指令。

对齐检查异常可以用来检查数据的对齐情况。当与严格要求数据对齐的处理器交换数据时,这个功能是很有用的。对齐检查异常还可以被编译器用来标记某些特殊的指针。编译器可以故意使这些指针不对齐。这可以消除不必要的对每个指针的检查而只需要处理那些特殊的指针。

VIF

虚拟中断(Virtual Interrupt,bit 19)——这是IF标志位的虚拟映像,与VIP标志位联合使用。只有VME标志位或控制寄存器CR4的PVI标志位被设1并且IOPL小于3时,处理器才会检查VIF标志位。(VME标志开启虚拟8086模式拓展;PVI标志开启保护模式虚拟中断。)

请见20.3.3.5《方法6:软件中断处理》和20.4《保护模式虚拟中断》。

VIP

虚拟中断悬挂(Virtual Interrupt Pending,bit20)——由软件设置,用于指示是否有中断被悬挂。设1则有,清0则没有。此标志位与VIF标志位联合使用。处理器会读这个标志位但不会自动修改它。只有VME标志位或控制寄存器CR4的PVI标志位被设1并且IOPL小于3时,处理器才会检查VIF标志位。(VME标志开启虚拟8086模式拓展;PVI标志开启保护模式虚拟中断。)

请见20.3.3.5《方法6:软件中断处理》和20.4《保护模式虚拟中断》。

ID

CPUID指令支持(Identification,bit 21)——程序能否修改此位指示处理器对CPUID指令是否支持。能修改则表示支持。

 

2.3.1IA-32e模式中的系统标志和位域

在64位模式中,RFLAGS寄存器被拓展到64位,但其高32位是保留的。RFLAGS(64位模式)或EFLAGS(兼容模式)中的系统标志已经在图2-4中示出。

在IA-32e模式中,处理器不允许设置VM位,因为虚拟8086模式不被支持(设置该位的意图将被忽略)。处理器不会设置NT位,但处理器允许软件设置NT位(注意,如果NT位被设1,在IA-32e模式中执行IRET将产生一个一般保护错误)。

在IA-32e模式中,SYSCALL/SYSRET指令有指定RFLAGS/EFLAGS中那些位被清0的可编程的方法。这些指令保存/恢复EFLAGS/RFLAGS。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值