80386简介--描述段描述符表

Intel 80386 微处理器的基本结构

Intel 80386 微处理器功能结构如图,它是三部分组成:中央处理部件CPU、存储管理部件MMU、总线接口部件BIU。



1.中央处理部件CPU:它由指令部件和执行部件组成。

(1)指令部件包括指令预取和指令译码两部分,各有一个队列,分别为指令预取队列和指令译码队列。指令预取用从存储器取出来的指令代码临时保存在指令预取队列中,然后见过指令译码的预译码后放入到已译码指令队列中,以供指令执行部件调用。执行部件由8个32位的通用寄存器、1个32位的算术运算单、1个64位的桶形移位器和乘/除硬件。80386采用微程序控制方式,所有80386指令对应的微程序存放在其内部的控制存储器中。指令译码器从指令预取队列中取指令,将操作码译成与该指令操作码相对应的控制ROM的入口地址,并存入译码指令队列中,该队列可容纳3条已译码指令。

(2)执行部件执行从译码指令队列中取出的已译码指令。它包含8个32位通用寄存器、32位的算术运算单元ALU、1个64位的桶形移位器和乘/除硬件。由于采用微程序技术,所以一条80386指令的执行过程实际是逐条执行该指令所对应的微程序中的微指令。出于缩短微指令宽度,即简化控制存储器电路的需要,微指令中广泛使用字段编译法,因此在行微指令的过程中还需要译码,即控制单元要对微指令的字段进行译码,产生一条指令操作的时序控制信号(即微操作信号)。80386的各个功能部件既能独立工作,又能与其他部件配合工作,因此80386可采用比8086并行度更高的流水线操作方式,总线接口部件、指令译码部件、执行部件及存储器管理部件四个部件并行工作,因此80386的指令流水线为4级。

2. 80386的寄存器结构

80386微处理器共有7类34个寄存器,通用寄存器组、段寄存器、指令指针和标志寄存器、系统地址寄存器、控制寄存器、调试寄存器、测试寄存器。


 (1)通用寄存器组:共有8个32位寄存器,EAX, EBX,ECX,EDX,ESP,EBP,ESI,EDI。它们由8086的16位寄存器扩展而来,它们的低16位与8086使用方法相同。

(2)段寄存器:共有6个16位的段寄存器CS、DS、SS、ES、FS、GS。与这6个段寄存器对应的有6个64位描述符寄存器,它是80X86处理器提供的一种附加的非编程的寄存器,用来装64的段描述符,每当一个段选择符被装入段寄存器是,相应的段描述符就由内存装入到对应的非编程的CPU寄存器。其中CS、DS、SS、ES与8086的段寄存器完全相同,在实地址方式下,使用方法也与8086相同;在虚地址保护方式下,这些寄存器中的值是“段选择符”,需要查全局描述符表(GDT)或者局部描述符表(LDT)来获得段的基地址,再加上偏移地址才能得到线性地址。 FS和GS是新加的附加数据段寄存器,可以由用户将FS、GS定义为其他数据段。

(3)指令指针和标志寄存器:指令指针寄存器EIP,由8086的IP寄存器扩展而来。标志寄存器EFLAGS包含一组状态标志、一个控制标志、一组系统标志,图四定义该寄存器中的标志位。

1. 段选择符(Segment Selector)

保护方式下,段选择符指示着段描述符,在段描述符中,包含有定义段所用的全部信息。其实,一个程序可以拥有比6 个段寄存器指示的段还要多的段。若某个程序使用的段多于6 个,当程序需要去访问一个新段时,就使用传送类指令MOV,去改变这些寄存器中的内容。由段选择符识别段描述符,而段描述符在段描述符表内被逐一登记注册。对应用程序来说,段选择符作为指针变量的一个组成部分是可见的,但段选择符的值通常是由连接编辑程序(Link Editor) 或连接装配程序(Linking Loader) 指定或修改的,而不是由应用程序指定,更不能由应用程序对其实施修改操作。段选择符是一个指向操作系统定义的段信息的指针,其格式如图所示。段选择符是由16位信息组成的,这16 位信息又被进一步细分成3 个字段:分别是13 位索引字段、1 位的指示符字段TI 以及2 位的请求特权级字段RPL。现分述如下:

保护方式段选择符格式

1) 段描述符指示符字段TI

TI 字段是位2,当TI=0时,该选择符指向的段是系统的全局地址空间(称为全局描述符表GDT);当TI=1 时,该选择符指向的段是一个特定程序或任务的局部地址空间(称为局部描述符表LDT)。全局地址空间用来存放运行在系统上的所有任务使用的数据和代码段,如操作系统服务程序、通用库和运行时间支持模块等。只要TI=0,便会指向这一空间,这也就是说,在系统上运行的所有任务共享同一个全局地址空间。局部地址空间用来存放一个任务独自占有的特定程序和数据,系统中每个任务都有其对应的局部地址空间。

顾名思义,全局描述符表是供系统中所有程序使用的;而局部描述符表是供各自运行程序使用的。如果操作系统允许,不同的程序可以共享同一个局部描述符表LDT。当然,系统也可以不使用局部描述符表LDT,而所有程序都使用全局描述符表GDT。

3) 索引字段

索引字段是由13 位组成,利用索引字段可以从拥有213 个的段描述符表中选出一个段描述符来。微处理机是用8(8 是段描述符的字节数)乘以索引值再加上描述符表的32 位基地址换算出来的。而描述符表的32 位基地址既可以是来自全局描述符表寄存器GDTR,也可以是来自局部描述符表寄存器LDTR。在这两种寄存器中保存着描述符表的起始线性地址,图8.5 示出了怎样用段选择符中的TI 位说明使用的是全局描述符表还是局部描述符表。


图 由指示符TI 位选择的描述符

逻辑地址经分段部件转换后所形成的地址被称之为线性地址。若没使用分页机制,这时的线性地址就是物理地址;如果使用了分页机制,二级地址转换机制(即分页机构)所生成地址就是物理地址。

2. 段描述符

段描述符,是由操作系统定义的、位于存储器内的一种数据结构,段描述符内保存着供处理机使用的有关段的属性、大小规模、段在存储器中的位置及控制和状态信息,段描述符在存储器中的一个段和一个任务之间形成了一个链。它是一种特殊的段,不管是全局地址空间还是局部地址空间中的一个段,如果没有描述符,则对该段任务来说便无效,且没有访问它的机制。一般说来,各段描述符是由各种编译程序、各种连接程序、各种装入程序或者操作系统产生的,而不是由各种应用程序生成的。

描述符分为段描述符和门描述符两大类。段描述符又分成两类:一般的段描述符(也称存储段描述符,包括代码段描述符和数据段描述符)和特殊的段描述符(又称系统段描述符,包括局部描述符表LDT 描述符和任务状态段TSS描述符等)。门描述符包括调用门描述符、任务门描述符、中断门描述符和陷阱门描述符4 种,当特权级之间和任务之间进行转移控制时,使用这些门描述符。各种类型段使用的段描述符只能是其中一种。

3. 段描述符表

段描述符表简称描述符表,用来存储保护方式下段描述符的一个阵列。80386/80486 CPU 共有3 种描述符表:全局描述符表GDT、局部描述符表LDT 和中断描述符表IDT。描述符表由描述符顺序排列组成,占一定的内存,由系统地址寄存器(GDTR 、LDTR、IDTR) 指示其在物理存储器中的位置和大小。

全局描述符表GDT 是供所有任务使用的描述符表,在物理存储器地址空间中定义全局描述符表GDT。通常操作系统使用的有代码段描述符、数据段描述符、调用门描述符、各个任务的LDT 描述符、任务状态段TSS 描述符、任务门描述符等。

局部描述符表LDT 是每一项任务运行时都要使用的描述符表。在多任务操作系统管理下,每个任务通常包含两部分:与其他任务共用的部分及本任务独有的部分。与其他任务共用部分的段描述符存储在全局描述符表GDT内;本任务独有部分的段描述符存储在本任务的局部描述符表LDT 内。这样,每个任务都有一个局部描述符表LDT,而每个LDT 表又是一个段,它也就必须有一个对应的LDT 描述符。该LDT 描述符存储在全局描述符表中。局部描述符表LDT 中所存储的属于本任务的段描述符通常有代码段描述符、数据段描述符、调用门描述符及任务门描述符等。

GDT 和LDT 段描述符表实际上是段描述符的一个长度不定的数据阵列,如图8.5 所示。描述符表在长度上是可变的,最多容纳213 个描述符,最少包含一个描述符。每个项有8 个字节长,称为一个段描述符。中断描述符表IDT暂不介绍。

4. 描述符表寄存器

80386/486 微处理机用全局描述符表寄存器GDTR 、局部描述符表寄存器LDTR 和中断描述符表寄存器IDTR,来查找全局描述符表GDT、局部描述符表LDT 和中断描述符表IDT, 如图 所示。


图 全局描述符表寄存器GDTR 和局部描述符表寄存器LDTR

1) 全局描述符表寄存器GDTR

在全局描述符表寄存器GDTR 内,保存着全局描述符表在物理地址空间内的32 位的基地址,同时全局描述符表寄存器GDTR 中,还保存表明这个表的规模大小为16 位的界限值,16 位段界限表明GDT 表最长为216KB(64KB) 。【例】 (GDTR)=0010 0000 0FFFH ,求GDT 在物理存储器中的起始地址,结束地址,表的大小,表中可以存放多少个描述符?解:

GDT 的起始地址为0010 0000H

结束地址为:0010 0000H+0FFFH=0010 0FFFH

表的大小为:0FFFH+1=4096 字节

表中可以存放:4096/8=512 个描述符

2) 局部描述符表寄存器LDTR

局部描述符表寄存器LDTR 包含一个16 位的选择器(63 位~48 位)和不可见的高速缓存器(47 位~0 位)。不可见的高速缓存器内保存着局部描述符表LDT 的基地址、它的界限以及访问控制权。对正在运行的任务而言,每一项任务运行时都要使用局部描述符表LDT, 它们存储在存储器的一个独立的段里。但每个LDT 处于存储器中的地址如图8.9 所示,用局部描述符表指令LLDT 对局部描述符表寄存器LDTR 内的选择符进行读操作,用保存在局部描述符寄存器内的16 位的选择符识别GDT,从GDT 中检索出相应的LDT 描述符,处理器便将局部描述符自动置入LDTR 的高速缓存器中,将该描述符装入高速缓冲寄存器就为当前任务创建了一个LDT。这样80386/486 微处理器便可以根据LDTR 高速缓存器的值来确定局部描述符表的起始地址和段界限,而不必再访问存储器从GDT 中查出LDT 描述符,直接从LDTR 高速缓存器来确定局部描述符表的起始地址和段界限,节省了程序运行时间。


操作系统根据LDT 使用情况为LDTR 赋值

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值