汇编语言与接口技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.2 CPU工作模式

在保护模式下,CPU可寻址高达4GB(甚至更多)的物理地址空间,支持存储器分段管理机制和分页管理机制,支持多任务,支持4个特权级和配套的特权检查机制,区分不同级别的代码。这些都是现代操作系统,如Windows、Linux等所必需的。如果CPU不支持这些特性,那么操作系统就不可能实现虚拟内存、内核/用户模式、多任务等特性。

从80386开始,32位CPU具有3种运行模式:实模式、保护模式和虚拟8086模式。CPU运行模式及其转换关系如图2-2所示。

图2-2 CPU的3种运行模式及其切换

2.2.1 实模式

CPU被复位(加电)时,自动进入实模式。在实模式下,这些CPU就相当于高性能的8086,使用1MB地址空间及16位的“段首址∶偏移”的地址格式,CPU的其他功能没有得到发挥。实模式下不支持硬件上的多任务切换;CPU不能对内存进行分页管理,所有的段都是可以读、写和执行的;同时,实模式也不支持特权级,即所有程序均可执行特权指令。在实模式下对一系列的寄存器进行设置,就可以进入保护模式。

DOS操作系统运行于实模式下,而Windows、Linux操作系统运行于保护模式下。

2.2.2 保护模式

在保护模式下,CPU支持内存分页机制,提供段式和页式内存管理功能,协助操作系统高效地实现虚拟内存,支持多任务和特权级等。工作在保护模式的时候,物理寻址空间高达4GB(80386/80486)或64GB(Pentium及以上CPU)。保护模式下,CPU执行JMP/CALL/IRET等指令,就可实现任务切换。任务执行环境的保护/恢复工作由CPU自动完成。在保护模式下,不同的程序可以运行在不同的特权级上。如图2-3所示,在保护模式下,CPU有4个特权级,分别为特权级0、1、2、3。操作系统运行在最高的特权级(Ring 0)上,存储器的管理(包括虚拟存储器)、任务间的通信、设备I/O等服务属于这一层次,称为核心态;特权级1,依赖于核心态,一般典型地用于系统服务,包括文件共享、显示管理及数据通信等;特权级2专用于用户扩展,而应用程序运行在低的特权级(Ring 3)上,理论上,处于特权级3的应用程序之间及它们和操作系统之间相互隔离,应用程序不能直接修改操作系统的程序和数据,也不能对其他应用程序的操作造成影响,形成保护。特权级1和特权级2目前在Windows和Linux操作系统中没有被使用。

图2-3 CPU的4个特权级

通过修改控制寄存器CR0的控制位PE(位0)来实现从实模式切换到保护模式。在这之前,还需要建立保护模式必需的一些数据表,如全局描述符表GDT和中断描述符表IDT等。

2.2.3 虚拟8086模式

在实模式下运行时,CPU与8086兼容,可以运行DOS及以8086为平台的几乎所有软件,但实模式下,处理器不能发挥自身的虚拟内存管理、特权级保护等功能,不支持多用户、多任务操作系统的运行。为了充分发挥处理器的功能,同时能兼容以前的DOS及应用程序(即8086程序),从80386开始,增加了虚拟8086模式(以下称V86模式)。

V86模式是为了在Windows、Linux系统中执行DOS程序而设计的,它是一种经过“修改”的保护模式。为了和DOS程序的寻址方式兼容,V86模式采用和8086一样的寻址方式,即用段寄存器乘以16作为基址,再加上偏移地址形成物理地址,寻址空间为1MB。V86模式是以任务形式在保护模式上执行的,每个任务都有自己的任务状态段,各个V86任务所拥有的1MB地址空间是相互独立的。操作系统利用分页机制将这些任务的地址空间映射到不同的物理地址,这样每个V86任务看起来都认为自己在使用1MB的地址空间。CPU可以同时支持多个真正的80386任务和多个V86模式任务。操作系统中,有一部分程序专门用来管理V86模式的任务,称为V86管理程序或V86监控程序。

V86模式又不等同于8086。DOS程序中有相当一部分指令在保护模式下属于特权指令,如屏蔽中断指令CLI、中断指令INT、中断返回指令IRET等。这些指令在DOS程序中是合法的。如果不让这些指令在V86模式中执行,DOS程序就无法工作。为了解决这个问题, V86管理程序采用模拟的方法来完成这些指令。这些特权指令在V86模式中执行时,引起保护异常。V86管理程序在异常处理程序中检查产生异常的指令,如果是中断指令INT,则从V86任务的中断向量表中取出中断处理程序的入口地址,并将控制转移过去。例如,当V86程序使用DOS功能调用“INT 21H”向屏幕上输出一个字符时,由V86监控程序将这个显示操作转换为对操作系统的调用,由其他代码在保护模式下将这个字符在V86程序所在的窗口上显示出来。如果是危及操作系统的指令,如CLI等,则简单地忽略这些指令,继续执行下一条指令。通过这些措施,DOS程序就可以在V86模式下工作,又不会危及操作系统。

在保护模式下,当标志寄存器EFLAGS中的VM位为1时,处理器就处于V86模式。此时,当前特权级(CPL)由处理器自动设置为3。

2.2.4 64位CPU的工作模式

CPU的发展已经进入了64位时代,主流CPU使用的64位技术主要有AMD公司的AMD64位技术、Intel公司的EM64T技术和IA-64技术。其中IA-64是Intel独立开发的,不兼容现在的传统的32位计算机,仅用于Itanium(安腾)及后续产品Itanium 2,一般用户不会涉及,因此这里仅介绍Intel的EM64T技术。

Intel公司的EM64T技术全名是扩展64位内存技术(Extended Memory 64 Technology)。EM64T是在IA-32指令集的基础上进行扩展的,通过64位扩展指令来实现兼容32位和64位的运算。EM64T技术设定了IA-32和IA-32e两种模式。

IA-32就是传统的模式(Legacy Mode)。这种模式是为了使64位CPU没有障碍地执行现有的32位和16位程序而设计的,这个模式本质上是把CPU中所有为64位计算而新增的运算机制都屏蔽起来,现有的x86程序无须做任何的改变就能运行,实际上就是32位x86时代的IA-32模式。

IA-32e模式有两个子模式:兼容模式和64位模式。IA-32e模式只能在装载64位操作系统的情况下才能激活。兼容模式(Compatibility Mode)是目前在64位操作系统下最常用的模式。因为现存的大量32位应用程序不可能在短期内为x86-64指令集而重新开发,为了保证现有的32位程序能够继续在64位CPU上顺利执行,兼容模式就像传统的保护模式一样,允许64位操作系统运行基于32位和16位代码的程序,即32位程序无须重编译即可以运行,而16位程序则要依赖于操作系统和驱动程序是否支持保护模式。兼容模式下,应用程序必须使用16位和32位地址和操作数,只能存取线性地址空间中的第一个4GB,处理标准IA-32指令前缀和寄存器,不提供REX前缀。

纯64位模式(Full 64 bit Mode)是EM64T技术中最为高效的模式。这种模式需要纯64位环境的支持,包括64位操作系统和64位应用程序。在64位操作系统和相应驱动程序的支持下,系统和应用程序能够访问EM64T所支持最大容量的扩展内存。当然,运行于此模式下的程序需要修改其微代码,以便支持64位指令操作。