2.1.3状态和控制寄存器

状态和控制寄存器是由标志寄存器EFLAGS、指令指针EIP4个控制寄存器组成,如图2.1所示:

标志寄存器

指令指针

机器状态字

Intel保留

页故障地址

页目录地址

 

 

                                                       EFLAGS

                                                       EIP

                                                       CR0

                                                       CR1

                                                       CR2

                                                       CR3

                           

                                   2.1状态和控制寄存器

 1.指令指针寄存器和标志寄存器

   指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset ),这个偏移量是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它起名叫指令指针IP寄存器,用于16位寻址。

   标志寄存器EFLAGS存放有关处理器的控制标志,如图2.2所示。标志寄存器中的第13515位及1831位都没有定义。

 

 

 

 

 

 

 

 

 


                     2.2 i386标志寄存器EFLAGS

    在这些标志位中,我们只介绍在Linux内核代码中常用且重要的几个标志位:

8TFTrap Flag)是自陷标志,当将其置1时则可以进行单步执行。当指令执行完后,就可能产生异常1的自陷(参看第四章)。也就是说,在程序的执行过程中,每执行完一条指令,都要由异常1处理程序 (在Linux内核中叫做debug())进行检验。当将第8位清0后,且将断点地址装入调试寄存器DR0DR3时,才会产生异常1的自陷。                                  

1213IOPL是输入输出特权级位,这是保护模式下要使用的两个标志位。由于输入输出特权级标志共两位,它的取值范围只可能是01234个值,恰好与输入输出特权级03级相对应。但Linux内核只使用了两个级别,即03级,0表示内核级,3表示用户级。在当前任务的特权级CPLCurrent Privilege Level)高于或等于输入输出特权级时,就可以执行像INOUTINSOUTSSTICLILOCK等指令而不会产生异常13(即保护异常)。在当前任务特权级CPL0时,POPF(从中弹出至标志位)指令和中断返回指令IRET可以改变IOPL字段的值。

9IFInterrupt Flag)是中断标志位,是用来表示允许或者禁止外部中断(参看第四章)。若第9IF被置为1,则允许CPU接收外部中断请求信号;若将IF位清0,则表示禁止外部中断。在保护模式下,只有当第1213位指出当前CPL为最高特权级时,才允许将新值置入标志寄存器EFLAGS以改变IF位的值。

10DFDirection Flag)是定向标志。DF位规定了在执行串操作的过程中,对源变址寄存器ESI或目标变址寄存器EDI是增值还是减值。如果DF1,则寄存器减值;若DF0,则寄存器值增加。

14NT是嵌套任务标志位。在保护模式下常使用这个标志。当80386在发生中断和执行CALL指令时就有可能引起任务切换。若是由于中断或由于执行CALL指令而出现了任务切换,则将NT置为1。若没有任务切换,则将NT位清0

17VM Virtual 8086 Mode Flag)是虚拟8086方式标志,是80386新设置的一个标志位。表示80386CPU是在虚拟8086环境中运行。如果80386CPU是在保护模式下运行,而VM为又被置成1,这时80386就转换成虚拟8086操作方式,使全部段操作就像是在8086CPU上运行一样。VM位只能由两种方式中的一种方式给予设置,即或者是在保护模式下,由最高特权级(0)级代码段的中断返回指令IRET设置,或者是由任务转换进行设置。Linux内核实现了虚拟8086方式,但在本书中我们不准备对此进行详细讨论。

   从上面的介绍可以看出,要正确理解标志寄存器EFLAGS的各个标志需要很多相关的知识,有些内容在本章的后续部分还会涉及到。在后面的章节中,你会体会如何灵活应用这些标志。

2.控制寄存器

 状态和控制寄存器组除了EFLAGSEIP ,还有四个32位的控制寄存器,它们是CR0CR1CR2CR3。现在我们详细看看它们的结构,如图 23所示。


                    23 386中的控制寄存器组

这几个寄存器中保存全局性和任务无关的机器状态。

CR0中包含了6个预定义标志,0位是保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处理位MP(Moniter coprocessor),它与第3位一起决定:当TS=1时操作码WAIT是否产生一个“协处理器不能使用”的出错信号。第3位是任务转换位(Task Switch),当一个任务转换完成之后,自动将它置1。随着TS=1,就不能使用协处理器。CR0的第2位是模拟协处理器位 EM (Emulate coprocessor),如果EM=1,则不能使用协处理器,如果EM=0,则允许使用协处理器。第4位是微处理器的扩展类型位ET(Processor Extension Type),其内保存着处理器扩展类型的信息,如果ET=0,则标识系统使用的是287协处理器,如果 ET=1,则表示系统使用的是387浮点协处理器。CR0的第31位是分页允许位(Paging Enable),它表示芯片上的分页部件是否允许工作,下一节就会讲到。由PG位和PE位定义的操作方式如图2.4 所示。


                        24   PG位和PE位定义的操作方式   

CR1是未定义的控制寄存器,供将来的处理器使用。

CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。

CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。

     这几个寄存器是与分页机制密切相关的,因此,在进程管理及虚拟内存管理中会涉及到这几个寄存器,读者要记住CR0CR2CR3这三个寄存器的内容。