SYSTEM FLAGS AND FIELDS IN THE EFLAGS REGISTER

类别:编程语言 点击:0 评论:0 推荐:
EFLAGS寄存器中的系统标志和IOPL域控制着I/O、可屏蔽硬件中断、Debugging、任务切换和虚拟86模式。应该只允许特权代码(比如操作系统)修改这些位。
以下是系统标志和IOPL的功能:
TF        Trap(bit 8)。设置的话打开单步调试模式;清除的话关闭单步调试模式。在单步调试模式中,处理器执行每一条指令后会产生一个debug异常,使得调试器可以在每条指令后检查程序状态。如果程序使用POPF、POPFD、IRET指令设置TF位的话,在POPF、POPFD、IRET指令指令后的下一条指令执行后,产生debug异常。

IF        Interrupt enable(bit 9)。控制处理器是否响应可屏蔽硬件中断。设置的话,允许中断。清除的话,屏蔽可屏蔽硬件中断。IF标志对异常和不可屏蔽中断(NMI interrupts)没有影响。控制寄存器CR4中的CPL、IOPL和VME状态标志决定IF位是否能被CLI、STI、POPF、POPFD和IRET指令修改。

IOPL    I/O privilege level field(bits 12 and 13)。决定了当前运行着的程序的I/O特权等级。当前程序的CPL必须比IOPL小或相等(更多的特权),才能访问I/O地址空间。这两个位只有在CPL等于0时,才能被POPF和IRET指令修改。
IPOL还是控制虚拟86模式下修改IF标志和处理中断的机制之一。

NT        Nested task(bit 14)。控制着中断和任务调用链。处理器在用CALL指令、发生一个中断、或发生一个异常而执行一个任务时,设置该位。在用IRET指令返回时处理器检查并修改该位。该位可以用POPF/POPFD指令来显式的改变。然而在应用程序中改变该位将造成无法预测的异常。

RF        Resume(bit 16)。控制处理器是否响应指令中断。如果设置该位,将暂时不产生debug exceptions,但是其他异常不受影响。清楚该位的话,就能够产生debug exceptions。
该标志的主要用途是使触发断点的指令能够重新运行。这时,调试器必须在堆栈中的EFLAGS中设置该位,该EFLAGS在用IRETD返回时将被加载。这样的话,可以防止该断点再一次触发debug异常。处理器将在该指令被成功执行后自动清楚该位。使该断点再次有效。

VM        Virtual-8086 mode(bit 17)。设置该位打开虚拟8086模式;清除的话返回保护模式。

AC        Alignment check(bit 18)。设置该位和在控制寄存器CR0中的AM标志将检查内存引用是否对齐。清除该位或是控制寄存器CR0中的AM标志将关闭对齐检查。如果打开了对齐检查,当访问一个没有对齐的操作数时,会引发alignment-check异常。比如在奇数地址的一个word或是一个doubleword的地址无法被4整除。alignment-check异常只有在用户模式(特权级3)下才会被触发。在特权级0时访问内存无论是否设置该位都不会触发alignment-check异常。
该异常可以用来检查数据是否对齐。这在和其他要求所有数据都对齐的处理器交换数据是非常有用。该异常还能用在解释器标识未对齐的指针。这可以消除检查每一个指针的开销,只处理指定的指针。

VIF    Virtual Interrupt(bit 19)。包含了IF标志的虚拟镜像。该标志和VIP标志配对使用。处理器仅仅在控制寄存器CR4的VME或是PVI标志被设定,并且IOPL小于3时,才识别VIF。(VME标志允许virtual-8086扩展模式;PVI标志允许保护模式虚拟中断)。

VIP    Virtual interrupt pending(bit 20)。由软件来设定,指示一个中断是未决的。清除该位来指示没有未决的中断。处理器会读取该位。但是不会修改它。处理器仅仅在控制寄存器CR4的VME或是PVI标志被设定,并且IOPL小于3时,才识别VIF。

ID        Identification(bit21)。程序或函数可以设置或清除该位来说明是否支持CPUID指令。

本文地址:http://com.8s8s.com/it/it23926.htm