(2)保护虚拟地址方式下的段寄存器
保护虚拟地址方式是一种既支持虚拟存储管理和多任务,又具有保护功能的工作方式。在该方式下,段的长度和段的属性都不固定,每个段的长度可以在1B到4GB之间变化(80286只能在1B到64KB之间变化),段的基址也只有在操作系统将该段从外存调入内存时才能确定。所以,为了描述每个段的基址、属性和边界(长度),为每个段定义了一个64位(80286为48位)的描述符,称为段描述符或描述子。
段描述符的格式如图所示。低48位是80286的描述符,包括16位段边界、24位段基地址和8位属性。80386以上的32位微处理器则在此基础上扩充了8位基地址、4位边界和4位属性,即包括20位段边界、32位段基地址和12位属性。其中属性位定义如下:
图 段描述符格式
① P为存在位,为1表示存在(在实内存中),为0表示不存在。 ② DPL为描述符特权级,允许为0~3级。
③ S为段描述符类别,为1表示代码段或数据段描述符,为0表示系统描述符。 ④ TYPE为段的类型。
⑤ A为已访问位,为1表示已访问过。
⑥ G为粒度位(段边界所用单位),为0表示字节,即段的最大长度为220B=1MB,为1表示页,在80386/80486中,每页为4KB,即段的最大长度为220×4KB=4GB,Pentium则提供了4KB和4MB两种页面选择。
⑦ D为缺省操作数长度,为0表示16位,为1表示32位(该位仅对代码段有效)。 这些段描述符存放在两个系统表格GDT和LDT中。GDT是全局描述符表,存放着操作系统使用的和各任务公用的段描述符;LDT是局部描述符表,存放着某个任务专用的段描述符。程序(或系统)中装入段选择器的也不再是直接的段基址,而是一个指向某个段描述符的16位的段选择符,其格式如图所示。其中b1b0位为请求特权级字段RPL,这两位提供(0~3级)4个特权级用于保护;b2位为表指示符字段TI,指明本段描述符是在GDT中还是LDT中;b15~b3这13位构成描述符索引字段INDEX,用于指明段描述符在指定描述符表中的序号。
图 段选择符格式
当将一个选择符装入一个段选择器(给段选择器预置初值)时,处理器将自动从GDT或LDT中找到其对应的描述符,装入相应段寄存器的描述符高速缓存器中。该过程对用户来说是透明的。如图所示,当将一个选择符装入DS段选择器时,处理器根据INDEX和TI指示自动从LDT中找到第64个描述符装入DS段寄存器的描述符高速缓存器。
以后,每当访问存储器时,与所用段相关的段描述符高速缓冲器就自动参与该次存储器访问操作。段基地址成为线性地址或物理地址计算中的一个分量,界限用于段限检查操作,属性则对照所要求的存储器访问类型进行检查。即:
线性地址=段描述符高速缓存器中段基址+偏移地址
不使用页部件时,线性地址即为物理地址;使用页部件时,上述线性地址需经页管理部件使用页目录表和页表转换成物理地址。
图 由段选择器指示自动装入段描述符
2. 系统寄存器
Pentium微处理器中包含一组系统级寄存器: 即5个控制寄存器CR0~CR4和4个系统地址寄存器。这些寄存器只能由在特权级0上运行的程序(一般是操作系统)访问。
1) 控制寄存器
Pentium微处理器有5个控制寄存器,如图所示。这些寄存器用来存放全局特性的机器状态和实现对80X86/Pentium微处理器的多种功能的控制与选择。
图 控制寄存器
(1) 控制寄存器CR0共定义了11个控制位。在80286微处理器中,CR0称为机器状态字MSW(Machine Status Word)为一16位寄存器,定义了PE、MP、EM和TS 4位。80386在此基础上扩充了ET和PG两位。80486以上微处理器在80386的基础上又扩充了NE、WP、AM、NW和CD这5位。11个控制位分别定义如下:
① PE为保护允许位,该位为1表示允许保护,为0则以实地址方式工作。
② MP为监控协处理器位,MP位同TS位一起使用,用来确定WAIT指令是否自陷。当MP=1,且TS=1时,执行WAIT指令将产生异常7。
③ EM为仿真协处理器位,用以确定浮点指令是被自陷,还是被执行。EM=1,所有浮点指令将产生异常7。
④ TS为任务切换位,用以指出任务是否切换,执行切换操作时,TS=1。TS=1时,执行浮点指令将产生异常7。
⑤ ET是处理器扩充类型,该位用于80386微处理器,标识系统中所采用的协处理器的类型。ET=1,采用80387协处理器,否则采用80287。80486以上系统中ET置1。
⑥ NE是数字异常控制位,该位用于控制是由中断向量16还是由外部中断来处理未屏蔽的浮点异常。NE=0,处理器同IGNNE输入引脚和FEPR输出引脚配合工作;NE=1,在执行下一条非控制浮点指令或WAIT指令之前,任何未屏蔽的浮点异常(UFPE)将产生软件中断16。
⑦ WP是写保护位,用来保护管理程序写访问用户级的只读页面。该位为1时,禁止特权级程序对只读页面的写操作,否则允许只读页面由特权级0~2写入。
⑧ AM是对准屏蔽位,用来控制标志寄存器中对准检查位(AC)是否允许对准检查。AM=1,允许AC位;否则禁止AC位。
⑨ NW为不通写控制位,该位用来选择片内数据Cache的操作模式。NW=1时,禁止通写,写命中时不修改内存;否则,允许通写。
⑩ CD是Cache禁止或使能位,该位用来控制允许或禁止向片内Cache填充新数据。CD=1,当Cache未命中时,禁止填充Cache;否则,未命中时,允许填充Cache。 PG为页使能位,用于控制是否允许分页。PG=1,允许分页,否则禁止分页。
(2) CR2是页故障线性地址寄存器,用来保存发生页故障中断(异常14)之前所访问的最后一个页面的线性页地址。用软件读出即可得到发生页故障的线性地址。CR2由80386以上微
处理器定义。
(3) CR3是页目录基地址寄存器,用来存放当前任务的页目录表的物理基地址。由于页目录表是按页对齐的(4KB),因而CR3通过高20位来实施这一要求,而低12位保留或定义为其他用途。CR3是80386以上微处理器才使用的,在80486中新定义了PWT和PCD两个控制位。PWT是页面通写位,用于指示是页面通写还是回写,该位为1,外部Cache对页目录进行通写,否则进行回写;PCD是页面Cache禁止位,该位用于指示页面Cache工作情况,PCD=1,禁止片内Cache,否则允许片内页Cache。这两个位只有在CR0中的页管理使能位PG=0或Cache不使能位CD=1时才有效。
(4) CR4是Pentium处理器中新增加的控制寄存器,共定义了6位,各位含义如下: ① VME是虚拟方式扩充位,VME=1,允许虚拟8086方式扩充,否则禁止。 ② PVI是保护方式虚拟中断位,PVI=1,允许保护方式虚拟中断,否则禁止。 ③ TSD是时间戳禁止位,该位为1,且当前特权级不为0时,禁止读时间戳计数器指令RDTSC,否则RDTSC将在所有特权级上执行。
④ DE是调试扩充位,该位用来控制是否支持I/O断点,当DE=1时,允许I/O断点调试扩充,否则禁止I/O断点调试扩充。
⑤ PSE是页尺寸扩充位,该位为1,允许页面大小扩充,每页为4MB,否则禁止页面大小扩充,每页仍为4KB。
⑥ MCE是机器检查允许位,该位为1,允许机器检查异常,否则禁止机器检查异常。 2) 系统地址寄存器
系统地址寄存器只在保护方式下使用,所以又叫保护方式寄存器。80X86/Pentium用4个寄存器把在保护方式下常用的数据基地址、界限和属性保存起来,以确保其快速性。这4个寄存器如图所示。
图 系统地址寄存器
(1) 全局描述符表寄存器GDTR
全局描述符表寄存器GDTR是一个48位字长的寄存器(对80286而言,为40位寄存器),用于存放全局描述符表GDT的32位(或24位)线性基地址和16位界限。
全局描述符表GDT是80X86/Pentium用来定义全局存储器地址空间的一种机制。全局存储器是一种可能被许多或所有软件任务共享的通用系统资源。也就是说,全局存储器中的存储器地址可被微处理器上的所有任务访问。该表存放着操作系统使用的和任务公用的段描述符,这些描述符标识全局存储器中的段。
用GDTR定义的全局描述符表如图所示。GDT的最大长度为216字节(64KB),由于每个描述符占8个字节,即GDT中最多能定义2=8192个段描述符。
13
图 GDTR与它定义的全局描述符表
(2) 中断描述符寄存器IDTR
中断描述符表寄存器IDTR也是一个48位字长的寄存器(对80286而言,为40位寄存器),用于存放中断描述符表IDT的32位(或24位)线性基地址和16位界限。
(3) 局部描述符表寄存器LDTR
局部描述符表寄存器LDTR也是80X86/Pentium存储器管理支持机制的一部分。每个任务除了可访问全局描述符表外还可访问它自己的专用描述符表。该专用表称为局部描述符表(LDT),它定义了任务用到的局部存储器地址空间。LDT中的段描述符可用来访问当前任务的存储器段中代码和数据。
由于每项任务都有它自己的存储器段,因此保护模式的软件系统可能会包含许多局部描述符表。所以,与段寄存器一样,LDTR值并不直接定义一个局部描述符表。它只是一个指向GDT中LDT描述符的选择符,所以LDTR和TR也称为系统段寄存器。如图所示,当LDTR中装入选择符时,相应的描述符就能够从GDT中读出来并装入LDTR的描述符高速缓存器,从而为当前任务建立了一个LDT。
LDT的最大长度也为64KB,即LDT中最多也只能定义8192个局部段描述符。
图 LDTR和它定义的局部描述符表
(4) 任务寄存器