美国Intel公司是目前国际上最有影响的微处理器生产厂家,已有近三十年的生产历史,80x86系列微处理器是其主导产品,占据了CPU市场的绝大部分份额。80x86的主要特征见表11.1。
8086/8088
|
80286
|
80386
|
80486
|
Pentium
| |
数据总线DB
|
准16
|
16
|
32
|
32
|
64
|
地址总线AB
|
20
|
24
|
32
|
32
|
32
|
最大寻址
|
1MB
|
16MB
|
4GB
|
4GB
|
4GB
|
时钟范围(MHz)
|
4.77
|
6~16
|
16~40
|
33~120
|
66~166
|
执行速度(MIPS)
|
0.05
|
0.4~0.8
|
3~4
|
20~75
|
112~280
|
80x86的寄存器可分为程序可见寄存器和程序不可见寄存器两大类,程序可见寄存器(图11.1)是可以由指令使用的寄存器,而程序不可见寄存器是一般应用程序中不使用而由系统使用的寄存器(图11.8)。
程序可见寄存器又分为通用寄存器、专用寄存器和段寄存器三类。
通用寄存器:
EAX AX AH AL
EBX BX BH BL
ECX CX CH CL
EDX DX DH DL
ESI SI
EDI DI
EBP BP
ESP SP
专用寄存器:包括指令指针寄存器和标志寄存器(图11.2)。
EIP IP
EFLAGS FLAGS
段寄存器:
CS DS SS ES FS GS
其中ES、FS、GS都是附加数据段,无缺省组合,必须加段前缀加以说明。
程序不可见寄存器包括:
系统地址寄存器
控制寄存器:保存全局性的机器状态
排错(DEBUG)寄存器
页面测试寄存器
系统地址寄存器: 控制寄存器:保存全局性的机器状态 排错(DEBUG)寄存器: 页面测试寄存器: 11.2.1 新增的寻址方式 |
16位 寻 址
|
32位 寻 址
| |
位 移 量
|
0,8,16位
|
0,8,32位
|
基 址 寄 存 器
|
BX,BP
|
任何32位通用寄存器(包括ESP)
|
变 址 寄 存 器
|
SI,DI
|
除ESP以外的32位通用寄存器
|
比 例 因 子
|
无
|
1,2,4,8
|
我们前面介绍的程序都是基于实模式(Real Mode)的,因为它们都依赖于段寄存器中的实地址值。实模式是DOS最早也是最简单的内存寻址模式,但实模式程序只能访问常规内存,对于80286、特别是80386以上内存可扩充到4GB这样大的系统,要想发挥它们的强大功能,就需要使用另外的工作方式。
对于Intel微处理器系列,保护模式(Protected Mode)的概念在80286上已开始使用,它允许访问装在第一个1M字节之上的程序和数据,操作起来就如同访问常规存储器;除此之外,386以上机器的内存管理还可以使用分页机制,以便访问多达16TB的虚拟存储器。下面先介绍一下保护模式中的基本概念。
11.4.1 描述符、选择器和描述符表
描述符:每个描述符占用8个字节,描述存储器段的位置、长度及控制和状态信息,其格式如图11.3所示。
描述符由基地址、界限、访问权和附加字段四部分组成:
(1)基地址(Base):80386以上处理器的基地址为32位,说明段可以从4GB存储器的任何地址开始。
(2)界限(Limit): 存放着该段的段长度。80386及其后继机型的界限部分为20位,
粒度位G(Granularity):在其描述符中给出了一个粒度位G。
当G=0时,段长的粒度单位为字节,这样20位段界限可使段长从1B到1MB,步距为1B;
当G=1时,段长的粒度单位为页,每页为4KB,所以20位段界限可定义的段长从1×4KB到1M×4KB,即从4KB到4GB,步距为4KB。
(3)访问权(Access rights):说明该段在系统中的功能,并给出访问该段的一些控制信息。应用程序的访问权字节可表示如图11.4所示。
其中:
P(Present)存在位: P=1说明该段已装入物理存储器,其基地址和界限值有效;
P=0说明该段并未装入物理存储器,基地址和界限值无用,如访问该段则会引起不存在异常。
DPL(Descriptor Privilege Level)描述符特权级字段:
用来指定该段的特权级0~3,0级为最高特权级。在保护模式下,当访问某段时,必须进行特权测试,根据其特权级的高低来决定是否允许访问该段。一般系统程序处于0级,用户程序处于3级。
S(Segment Descriptor)段描述符位:
S=0表示该段为系统段;
S=1表示该段为应用程序的代码段或数据(包括堆栈)段。
E(Executable)可执行位:
E=0说明该段为不可执行段,即数据段;
E=1则说明该段为可执行段,即代码段。
ED(Expansion Direction)扩展方向位:
ED=0表示该段为向上扩展段,指数据段。
ED=1表示该段为向下扩展段,指堆栈段。
W(Writeable)可写位:
W=0指示数据段不能写入;
W=1指示数据段可以写入。在堆栈段的情况下W必须为1。
C(Conforming)符合位:在保护模式下,对段的访问要受特权级的限制。一般来说,系统程序的特权级为0,处于高特权级;而用户应用程序的特权级为3,处于低特权级。对特权的管理是有一整套严格的规则的,一般低特权级程序不允许任意访问或调用高特权级程序,必须在系统管理下,服从一定的规则才允许访问或调用。然而,在某些情况下,这种调用又是必须的。例如,系统提供的一些标准子程序如数学库、码制转换程序以及一些常用的处理异常情况下的例行程序如除法错、超出界限等异常处理又经常需要提供应用程序使用。为方便起见,设置了C位。
C=1的代码段称为符合(Conforming)段,这种段允许特权级与它相同或特权级比它低的程序调用或通过JMP指令转入;
C=0的代码段称为非符合(Non-conforming)段,低特权级的程序对高特权级的非符合段的调用或转入将产生保护异常。
系统就采用这种方法把一些常用的例行程序放在C=1的代码段中,使它们可以方便地为不同特权级的程序所共享。
R(Readable)可读位:
R=0指示代码段只能执行不能读出;
R=1指示代码段既可执行又可读出。
后一种情况可用于在某些特殊情况下有一些常数可以和指令码放在一起,此时系统可利用这一特性提供读出这些常数的方法。
A(Accessed)已访问位:
A=0表示该段尚未被访问过;
A=1表示该段已被访问过。
此时的选择器已装入段寄存器或该段已用于选择器测试指令。该位的设立便于软件对段使用情况的监控。
G粒度位:
G=0时,段长的粒度单位为字节;
G=1时,段长的粒度单位为页。
D/B位:
在代码段里,这位称为D(Default operation size) 缺省操作长度位。
D=1表示操作数及有效地址长度均为32位;
D=0则为16位操作数和16位有效地址。
在数据段里,这位称为B位。
B=1使用32位ESP寄存器;
B=0则使用16位SP寄存器。
AVL(Available)可用位:
该位只能由系统软件使用。
描述符的内容是由系统设置的,它全面地描述了段的大小,段在存储器中的位置以及段的各种属性。
选择器和描述符表:
描述符存放在描述符表中,描述符表都存放在存储器中,每个表分别构成一个64KB长的段,表中可存放8K描述符,一共有三种描述符表:
全局描述符表(GDT):包含系统所有任务都可用的描述符
局部描述符表(LDT):包含了与一个给定任务有关的描述符
中断描述符表(IDT):通过门描述符可寻址到相应的中断处理程序入口
选择器存放在段寄存器中,16位长,其格式如图11.5所示。
11.4.2 保护模式下的存储器寻址
从逻辑地址通过选择器找到描述符表,再找到描述符,由此确定所选段和存储单元的过程如动画所
保护模式下的存储器寻址带来两个问题:
(1)选择器给出了描述符表中的描述符地址,那么描述符表又在哪里呢?怎么能找到它呢?
(2)保护模式的寻址过程并不复杂,只是间接地取得存储器地址而已。但是,正因为间接,就要增加一次对存储器的访问,以取得描述符,从而找到所要的段。这样,在保护模式下,访问时间会增加很多。那么怎样保证系统的运行速度呢?
图11.6给出了80x86处理器的程序不可见寄存器。其中GDTR、IDTR和LDTR分别为全局描述符表寄存器、中断描述符表寄存器和局部描述符表寄存器。GDTR和IDTR中分别存放对应描述符表的基地址和界限值。当使用保护模式工作时,由系统将基地址和界限值填入GDTR
虚拟8086方式(Virtual-8086 Mode)是一种在保护模式下运行的类似实模式的工作方式,它具有以下特点(左)。
(1)保护模式下启动,与8086兼容,提供最大灵活性:
允许同时在8086操作系统下执行8086的应用程序和在80386操作系统下执行80386的应用程序。
(2)V86寻址方式与实址方式一样:
PA=(sreg)×16+offset
(3)V86程序与保护方式一样需经特权级检查:
实址方式:隐含为在特权级0下运行,不会产生特权违法。
V86方式:规定在特权级3下运行,执行特权指令会产生保护故障。
(4)V86方式的进入和退出等效于特权级别的变化和堆栈的切换:
进入:通过调用(CALL)和跳转(JMP)到一个TSS(Task State Segment),并通过此TSS的VM=1,即可进入V86方式。
退出:跳转(JMP)到VM=0的TSS(在特权级0下)。
(5)V86方式属于保护模式环境的一部分:
V86模式下所有硬件中断和软件中断都对应保护模式下的IDT项,而不是对应实地址模式下的中断机制。
在保护模式下,中断寻址过程依赖于中断描述符表IDT,每类中断和异常对应IDT中的一个8字节的门描述符,通过IDT可以"分门别类"的处理各种中断和异常,以保护中断操作不受到其它任务的侵害。
在保护模式下,中断例行程序的入口是通过中断描述符表找到中断描述符来取得。由于每个描述符为8字节长,所以类型号应乘以8才能取得所指定类型的中断描述符。
11.6.1 中断描述符表(IDT)
(1)门描述符
(2)任务门
(3)中断门和陷阱门
11.6.3 中断过程
以一条中断指令INT n为例,由于中断描述符表IDT的线性基地址与表的大小由IDTR的base字段和limit字段指明,所以根据中断类型号计算出base + n * 8,即是该中断IDT项的地址,取出IDT项中的门描述符,经过访问权检验,并将选择器值(selector)送入CS,偏移量(offset)送入EIP,即获得了陷阱处理子程序的入口地址(动画)。
装入和存储IDTR的指令是LIDT和SIDT。这两条指令只能由当前特权级为0的过程(一般为操作系统)使用,一般应用程序不能设置和保存IDTR。
格式:LIDT mem ;将IDT的基地址和段限装入IDTR
格式:SIDT mem ;将IDTR的段限部分和线性基地址写入
在IDT相应的项中设置中断门、陷阱门和任务门的工作一般由操作系统完成,但相关的服务接口目前还未形成统一标准,有的内部调用随操作系统(如DOS、Windows)及其不同版本变动很大,调用时应加以小心。
(2)基址比例变址寻址方式
(Based scaled indexed addressing)
EA = (变址寄存器) * 比例因子+(基址寄存器)
例:MOV ECX, [EAX][EDI * 4]
(3)相对基址比例变址寻址方式
(Relative based scaled indexed addressing)
EA = (变址寄存器) * 比例因子+(基址寄存器)+位移量
例:MOV EAX, TABLE[EBP][EDI * 4]
归纳起来,有效地址的计算可以下式表示:
EA = 基址 +(变址 * 比例因子)+位移量
这四个成分中,除比例因子是固定值外,其他三个成分都可正可负,以保证指针移动的灵活性。
8086/80286只能使用16位寻址,而80386及其后继机型则既可用32位寻址,也可用16位寻址。在这两种情况下,对以上四种成分的组成有不同的规定,表11.2说明了这一规定。