第10章保护模式及其编程.ppt

上传人:sccc 文档编号:6614834 上传时间:2023-11-18 格式:PPT 页数:163 大小:1.02MB
返回 下载 相关 举报
第10章保护模式及其编程.ppt_第1页
第1页 / 共163页
第10章保护模式及其编程.ppt_第2页
第2页 / 共163页
第10章保护模式及其编程.ppt_第3页
第3页 / 共163页
第10章保护模式及其编程.ppt_第4页
第4页 / 共163页
第10章保护模式及其编程.ppt_第5页
第5页 / 共163页
点击查看更多>>
资源描述

《第10章保护模式及其编程.ppt》由会员分享,可在线阅读,更多相关《第10章保护模式及其编程.ppt(163页珍藏版)》请在三一办公上搜索。

1、第10章 保护模式及其编程,10.1 保护模式基础 10.2 虚拟内存管理 10.3 特权级保护 10.4 任务 10.5 中断和异常 10.6 虚拟8086模式 10.7 操作系统类指令,10.1 保护模式基础,在保护模式下:寻址高达4GB的物理地址空间 支持存储器分段管理机制和分页管理机制支持多任务支持4个特权级和配套的特权检查机制区分不同级别的代码,10.1.1 32位CPU内部结构,CPU有8个处理单元:执行单元、分段单元、分页单元、总线单元、指令预取单元、指令译码单元、高速缓存单元和浮点运算单元。,1总线单元,总线单元是CPU与存储器和I/O的接口 总线接口对外提供:32位(或64位

2、)数据总线、32位(或36位)地址总线以及控制总线 总线单元负责完成所有外部总线操作,能够产生控制地址锁存器和数据总线收发器工作的控制信号。,2指令预取单元,指令预取单元实现指令流队列的机制CPU可以预取16字节的指令代码预取进来的指令要保存在FIFO队列中,3指令译码单元,指令译码单元接收FIFO队列的输出指令译码单元将接收到的机器代码指令译码为微代码指令,并供执行单元使用,4执行单元,执行单元取出译码后的指令并执行该操作,包括:算术逻辑单元ALU寄存器组专用乘法器移位器控存(ROM),5分段和分页单元,分段和分页单元负责地址产生、地址转换和对总线接口单元的段检查。CPU存储器管理的分段单元

3、用硬件进行高速地址计算,完成逻辑地址到线性地址的转换和保护性检查;分页单元实现保护模式下的分页机制,它可以将线性地址转换成物理地址,并由总线单元输出。,6浮点运算单元,浮点运算单元集成在80486及以上的CPU中;对于80386,需要另外一个数学运算协处理器80387来执行浮点运算。,7高速缓存单元,高速缓存单元将最近被访问的内存单元的内容保存在CPU内部的Cache中。下次访问这些内存单元时,CPU直接访问Cache就可以存取这些单元的内容。由于Cache的访问速度比内存快,高速缓存单元能够显著提高程序的运行速度。,10.1.2 三种运行模式,CPU具有三种运行模式:实模式、保护模式和虚拟8

4、086模式,关系如下:,1实模式,CPU被复位(加电)时,自动进入实模式。实模式不支持硬件上的多任务切换 CPU不能对内存进行分页管理 实模式也不支持特权级 DOS操作系统运行于实模式下,2保护模式,实模式下对一系列的寄存器进行设置,就可以进入保护模式。CPU提供了段式和页式内存管理功能 CPU支持多任务和特权级 Windows/Linux操作系统运行于保护模式下,3虚拟8086模式,虚拟8086模式是为了在Windows/Linux系统中执行DOS程序而设计的,它是一种经过“修改”的保护模式。,4特权级,在保护模式下,CPU有4个特权级(03),操作系统运行在高的特权级(0)上,而应用程序运

5、行在低的特权级(3)上。,10.1.3 寄存器,32位CPU支持的寄存器有以下几种:1通用32位寄存器 分别是:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP。主要用于算术运算、逻辑运算以及对内存操作数的寻址。,2标志寄存器,标志寄存器EFLAGS也扩展为32位,位11到位0和8086完全相同。这里主要扩展了4个标志位:V86模式位VM(位17)此位为1时,表示当前CPU正工作在V86模式下;此位为0,表示当前CPU工作在实模式或保护模式下。嵌套任务位N(位14)当前的任务嵌套在其他任务中,此位为1,否则为0恢复位RF(位16)I/O域IOPL(位13和12),3指令指针寄存器

6、EIP和堆栈指针寄存器ESP,指令指针寄存器EIP,它总是下一条要执行的指令的偏移地址,偏移地址指的是这条指令在代码段中的位置。堆栈指针寄存器ESP,用于存放当前堆栈段中栈顶的偏移地址。他们的低16位分别是IP和SP,4调试寄存器DR,调试寄存器提供高级的调试功能 例如:可以设置一个数据断点,在程序访 问某个数据时激活调试程序。,5测试寄存器TR,测试寄存器提供对TLB的测试。,6全局描述符表寄存器,全局描述符表GDT是用来定义全局存储器空间的一种机制,它用段描述符说明一个全局存储器中的段,每个GDT最多含有8192个描述符(8192864KB)。用全局描述符表寄存器GDTR指出GDT的位置和

7、大小。,GDTR是48位的寄存器。其最低16位是限长,给出GDT的字节大小;其高32位是基址,指出GDT在物理存储器中存放的基地址。例如:GDTR=0E003F0003FFH,则说明GDT的地址为0E003F000H,长度为3FFH+1=400H。其中可容纳400H/8=80H个段描述符。,7中断描述符表寄存器,中断描述符表IDT中保存着中断门描述符;IDT最多包含256个门描述符,CPU最多支持256个中断。中断描述符表寄存器IDTR是48位的寄存器。其最低16位是限长,给出IDT的字节大小;其高32位是基址,指出IDT在物理存储器中存放的基地址。,中断描述符表寄存器,例如:IDTR=0E0

8、03F40007FFH,则说明IDT的地址为0E003F400H,长度为7FFH+1=800H。其中可容纳800H/8=100H个中断门描述符。,8局部描述符表寄存器,局部描述符表LDT含有与系统中某一个任务相关的各个段的描述符;局部描述符表寄存器LDTR并不直接指出LDT的位置和大小,而是指向一个LDT描述符,由LDT描述符指出LDT的位置和大小。,9任务寄存器TR,任务寄存器TR在保护模式的任务切换机制中使用。TR是16位的选择符,其内容为索引值,它选中的是TSS描述符。任务状态段TSS中包含启动任务所必需的信息。它在存储器的基地址和限长(大小)由TSS描述符指出,TSS描述符放在全局描述

9、符表GDT中,而TR内容指出了TSS描述符在GDT中的顺序号。,10控制寄存器,存在着4个系统控制寄存器CR0CR3。CR0的低5位是系统控制标志,被称为机器状态字MSW。MSW中各位的含意:PE:保护模式允许标志 等于0为实模,等于1为保护模式 MP:运算协处理器存在位 等于1表示系统中有运算协处理器。,MSW中各位的含意(续),EM:等于1时系统用软件模拟器执行数学运算 TS:任务切换标志。当任务切换时,自动设置此位为1 PG:等于1时,存储器管理单元允许分页;等于0时,分页功能被关闭,线性地址等于物理地址。,11段寄存器CS,DS,ES,SS,FS,GS,32位CPU有6个段寄存器,比1

10、6位CPU增加了FS和GS两个段寄存器。在实模式下,它们的用法和16位CPU相同 在保护模式下,段寄存器不直接存放段基址,而是存放一个索引,由索引从GDT或LDT中找到段描述符,从而确定关于这个段的全部描述信息。这个索引被称为段选择符。,段寄存器(续),选择符的格式如下RPL:请求特权级,2位二进制数字,求特权级是将要访问的段的特权级。TI:表指示符。为0时,从GDT中选择描述符;为1时,从LDT中选择描述符。Index:索引。指出要访问描述符在段描述符表中的顺序号。,10.1.4 显示CPU寄存器的值,要取得GDTR,IDTR,TR,LDT寄存器的值,分别使用SGDT,SIDT,STR,SL

11、DT指令,这些指令将寄存器的内容保存到内存单元中。程序举例:cpuregs.asm,10.2 虚拟内存管理,如果程序要访问的内容不在内存中,CPU会产生一个异常,由操作系统的存储器管理程序来处理,将所需的内容装入内存中。这就是所谓的虚拟存储器,它并不完全是真正的内存空间,也称做虚拟内存。,10.2.1 段式内存管理功能,将虚拟地址转换为线性地址,由CPU的分段部件完成。虚拟地址:程序指令中使用的地址,由段和偏移两个部分组成 线性地址:段的基地址再加上偏移量 物理地址:从微处理器引脚上输出的地址信号,虚拟地址到线性地址,再到物理地址的转换过程,3段描述符,段描述符用于描述代码段、数据段和堆栈段。

12、段描述符的格式如图:,段描述符,段描述符位于GDT或LDT中,占64位,由以下几个部分组成:段基址(32位)限长(20位)访问权限(8位)属性(4位),访问权限字节,访问权限字节定义如下 P:存在位 等于1时表示该段己装入内存;等于0时表示该段没有在内存中,访问这个段会产生段异常。DPL:描述符特权级,说明这个段的特权级,访问权限字节,S:描述符类型位 为1时,这个段为代码段、数据段或堆栈段;为0时,为系统段描述符。E:可执行位,区分代码段和数据段 S=0且E=1时,这是一个代码段,可执行。S=0且E=0时,这是一个数据段或堆栈段,不可执行。E=0时,后面的两位为ED和W;若E=1时,后面的两

13、位为C和R。,访问权限字节,ED:扩展方向位 为0时,段从低地址向高地址扩展,偏移量小于等于限长。为1时,段从高地址向低地址扩展,偏移量必须大于限长。W:写允许位为0时,不允许对这个数据段写入;为1时,允许对这个数据段写入。,访问权限字节,C:一致位为0时,这个段不是一致代码段为1时,这个段是一致代码段R:读允许位为0时,不允许读这个段的内容为1时,允许读这个段的内容A:访问位为1表示段已被访问过为0表示段未被访问过。,属性位,属性位包括G、D、AVL等 G:粒度位。G1时,限长以页为单位;G0时,限长以字节为单位。D:默认操作数宽度。D1时,为32位数据操作段;D1时,为16位数据操作段。A

14、VL:可用位。这一位保留给操作系统或应用程序来使用,段描述符高速缓存,在读写内存单元时,CPU需要检查段描述符的内容是否和当前操作相一致,CPU的运行效率极大地降低。为解决这个问题,CPU在内部设置了段描述符高速缓存。在指令执行过程中,只有段寄存器的值发生改变时,才需要到GDT或LDT中装入段描述符。如果段寄存器的值不改变,高速缓存中的段描述符可以被直接引用,这样就避免了到主存中频繁读取段描述符。提高了CPU的效率。,10.2.2 页式内存管理功能,段式内存管理是将形如DS:EBX的虚拟地址,由DS的段基址再加上偏移部分,就得到了线性地址。分页管理将分段管理机制得到的线性地址转换为物理地址。使

15、用分页机制的好处:可以把每个活动任务当前所必需的少量页面放在内存中,而不必将整个段调入内存,从而提高了内存的使用效率。,1分页,页的长度固定为4KB 页与页之间没有重叠 页式内存简化了存储器管理 不能充分地利用内存,会产生碎片,2线性地址到物理地址的映射,线性地址按页为单位映射到物理地址 每一个线性页面只能映射到一个物理页面上多个线性页面可以映射到同一个物理页面上,3线性地址转换为物理地址的过程,32位线性地址被划分为3个部分:页目录索引(10位),对页目录的索引页表索引(10位),对页表的索引字节索引(12位),线性地址在页面内的偏移。,线性地址转换为物理地址的过程图,线性地址转换为物理地址

16、的过程,以PDBR的值作为页目录的基地址,定位到页目录。用线性地址中的页目录索引(10位)在页目录表中找到一个页表描述符。页表描述符的高20位给出了页表的基地址。线性地址中的页表索引(10位),指示了被访问的页在页表中的序号。页描述符的高20位给出了物理页面的基地址。物理页面的基地址再加上线性地址中的12位字节索引,便得到32位线性地址对应的32位物理地址。,4片内转换检测缓冲器TLB,为了提高转换效率,CPU内部设置了片内转换检测缓冲器TLB,其中保存了32个页描述符,它们都是最近使用过的。在从线性地址转换为物理地址时:如果线性地址的页描述符已在TLB中,则无需再经二级转换就可以直接引用。如

17、果线性地址的页描述符没有在TLB中,则需要访问页目录表和页表来取得页表描述符和页描述符,最后将这个页描述符存在TLB中。,5页表项,页表项就是在分页转换时用到的页表描述符和页描述符,它们都是32位的,其格式:页表项的低12位提供保护功能和统计信息。U/S位、R/W位、P位实现页保护机制;而D位和A位提供统计信息。,页表项,U/S:用户/管理员位 U/S=0时,只有操作系统程序可以访问该页,而不允许用户程序访问 U/S=1时,允许用户程序访问该页 R/W:读写位 R/W0,用户程序对页面只有读权限,不能写入;R/W1时,可读/写,页表项,P:存在位。P=1,页表或页存在于物理内存中;P=0,页表

18、或页没有在物理内存中。A:访问标志。如果对某页表或页访问过,CPU设置页表项中的A位为1。D:写入位。D=1时表示对该页进行过写操作,D=0时表示对该页还没有进行过写操作。AVL占3位,可以由操作系统使用,7Pentium的4MB页面,Pentium的页表项增加了3个属性位:SIZ,PCD和PWT。SIZ(Size)页尺寸位:SIZ=0时,页面的大小为4KB。SIZ=1时,页面的大小为4MB。,PCD位:PCD=0时,允许页被缓存;PCD=1时,禁止页被缓存。PWT位:PWT=0时,使用回写策略;PWT=1时,使用通写策略。通写策略指的是指令将数据写到页面Cache时,立即更新内存中的页面;回

19、写策略指的是指令将数据写到页面Cache后就认为指令已经完成,以后再将页面Cache中的数据更新到内存中。,8Pentium的物理地址扩展功能,第5位PAE位为1时,就启动物理地址扩展功能 线性地址仍然为32位,分为4个部分:PDPT索引(2位)页目录索引(9位)页表索引(9位)字节索引(12位),页表项,从原来的4字节扩展为8字节页目录和页表的大小仍然为4KB PAE功能启用且SIZ1时,线性地址的格式如图,9Pentium III的页面大小扩展功能,在分页状态下,PAE=0、PSE=1时,就启用了PSE功能。启用PSE时,PAE功能必须关闭。启用PSE功能时,由页目录项中的SIZ位(也称P

20、S位)来确定页面的大小。,10.3 特权级保护,保护模式下设置了0、1、2、3共4个特权级,以区分操作系统程序和应用程序。可以阻止用户程序对操作系统的非法访问保证高特权级的代码或数据不被低特权级的程序所破坏。,10.3.1 对数据访问的保护,为段寄存器赋值时的检查 当前是否在物理存储器 段类型是否与目标段选择符类型一致 当前程序是否具有可以访问这个段的特权级访问内存时的检查操作数的偏移量是否超出段的边界 操作是否与段的保护属性匹配,10.3.2 对程序转移的保护,1直接转移的保护程序控制在同一代码段内转移时,只需要检查限长,保证程序转移后的目标地址不超过当前代码段的边界。如果要进行段间调用或跳

21、转,则需使用远跳转或远调用指令,这时既要检查限长,还要检查特权级CPL和DPL。CPL=DPL,允许跳转和调用。转移后,CPL没有改变,CPLDPL,此时要检查段描述符的C位。如果C位为1,表示这是一致代码段,允许转移,CPL并不改变。如果C位等于0,则禁止转移。2间接转移的保护间接转移采用JMP/CALL X:Y指令,X指门选择符,10.3.3 门,门可以看做是一种转换机构。门有4种类型:调用门(用来改变任务或者程序的特权级别)调用门中包含了入口点的虚地址:目标选择符偏移量 任务门(用来执行任务切换)中断门(指出中断服务程序的入口地址)陷阱门(指出中断服务程序的入口地址),1系统描述符,门描

22、述符属于系统描述符,格式如下16种系统描述符类型见书352页,2调用门,调用门描述符中的参数计数值表示:有多少个参数必须从主程序的堆栈复制到被调用子程序的堆栈。在使用调用门时,CPU也要进行权限检查,权限检查时要依据以下几个因素:1.当前特权级CPL 2.请求特权级RPL,3.DPLGATE,即门描述符的DPL 4.DPLCODE,即目标代码段描述符的DPL5.CCODE,即目标代码段描述符的C位 使用CALL指令时,CPU检查以下两个条件:DPLGATEMAX(CPL,RPL)DPLCODECPL使用JMP指令时,CPU检查以下两个条件:DPLGATEMAX(CPL,RPL)CCODE为1且

23、DPLCODECPL 或 CCODE为0且DPLCODECPL 只有条件满足了才能使用调用门,10.4 任务,完成某项功能的多个程序的集合称为任务 CPU允许系统中存在多个任务 任务能以分时的方式使各程序轮流执行,用户感觉到所有的任务是在同时运行在保护模式下每个任务是独立的 系统中至少存在一个任务,10.4.1 任务状态段,每个任务都由两个部分组成:任务执行环境TES任务执行环境包括一个代码段、堆栈段和数据段等,任务在每一个特权级上执行时都有一个堆栈段每个任务都有一个LDT描述符表,构成一个局部地址空间,局部空间的数据和代码不能被其他任务访问。任务状态段TSS,2任务状态段TSS,TSS中保存

24、了任务的各种状态信息 TSS描述符中规定了任务状态段的基地址和任务状态符的大小,格式如下:,TSS的基本格式,TSS的基本格式由104字节(000H065H)组成,这些字节可分为:寄存器保存区域 内层堆栈指针区域地址映射寄存器区域 链接字段 调试陷阱位T I/O许可位图,寄存器保存区域,用于保存通用寄存器段寄存器指令指针标志寄存器 当TSS对应的任务正在执行时,保存区域中的值是无意义的;在当前任务挂起时,这些寄存器的当前值就保存在该区域。,内层堆栈指针区域,TSS的内层堆栈指针区域中有3个堆栈指针,分别指向0级、1级和2级堆栈的栈顶。当特权级提升时,从TSS中取出相应级别的堆栈指针装入SS及E

25、SP寄存器,以切换到高特权级的堆栈,而原先SS及ESP的内容则保存在这个新的堆栈中。当高特权级向低特权级转移时,CPU并不把高特权级的堆栈指针SS:ESP保存到TSS中。,地址映射寄存器区域,TSS中保存了任务的CR3和LDTR。在任务切换时,处理器自动从新任务的TSS中取出这两个字段,分别装入到寄存器CR3和LDTR。这样就改变了虚拟地址空间到物理地址空间的映射。,链接字段,链接字段位于在TSS偏移0开始的双字中,其高16位未用低16位保存前一任务的TSS的选择符,调试陷阱位T,在TSS内偏移64H处的16位是为任务提供的属性。最低位T表示调试陷阱位。发生任务切换时,如果新任务的T位为1,那

26、么在切换到新任务后,立即产生调试陷阱。,I/O许可位图,任务使用的I/O许可位图也存放在TSS中,以作为TSS的扩展部分。在TSS内偏移66H处的字用于存放I/O许可位图在TSS内的偏移(从TSS的头开始计算)。,10.4.2 任务切换,1直接任务切换段间跳转指令JMP X:Y或段间调用指令CALL X:Y可以用来执行任务切换。在中断/异常或者执行IRET指令时也可能发生任务切换。2.间接任务切换 通过任务门可以进行任务的间接切换,任务A到B的切换步骤,检查目标任务B状态段的限长 把寄存器现场保存到当前任务A的TSS 把指示目标任务(任务B)TSS的选择符装入TR寄存器中,同时把对应TSS的描

27、述符装入TR的高速缓冲寄存器中 恢复当前任务(任务B)的寄存器现场 把CR0中的TS标志置为1,任务A到B的切换步骤(续),把TSS中的CS选择符的RPL作为当前任务特权级,设置为CPL装载LDTR寄存器 装载代码段寄存器CS、堆栈段寄存器SS和各数据段寄存器及其高速缓冲寄存器。,任务内特权级变化时TSS中堆栈指针的使用,在特权级提升时:TSS中相应的堆栈指针对SS及ESP寄存器进行初始化,建立起一个空栈 把低特权级程序的SS及ESP寄存器的值压入堆栈 从低特权级堆栈复制以双字为单位的调用参数到高特权级堆栈中 调用的返回地址被压入堆栈,RET指令及步骤,CALL指令不能向低特权级转移;RET指

28、令不能向高特权级转移。RET指令所使用的返回地址的选择符也只能是代码段描述符,而不能是系统描述符或门描述符。执行“RETF n”指令时,步骤如下:RET指令先从堆栈中弹出返回地址为返回低特权级代码,跳过高特权级堆栈中的,RET指令(续),参数,再从高特权级栈中弹出指向低特权级堆栈的指针,并装入SS及ESP,切换到低特权级堆栈。调整ESP,跳过主程序压入到低特权级堆栈的参数。检查数据段寄存器DS,ES,FS及GS,以保证寻址的段在低特权级是可访问的。返回到主程序的下一条指令执行。立即数n规定了堆栈中要跳过的参数的字节数。,10.4.3 输入/输出保护,CPU采用I/O特权级IOPL和TSS段中I

29、/O许可位图的方法来控制输入/输出,实现输入/输出保护。,1I/O敏感指令,在EFLAGS寄存器中,有两位是输入/输出特权级IOPL。CPLIOPL时,可以执行I/O敏感指令。EFLAGS标志寄存器中的IOPL 任务状态段中的I/O许可位图也影响I/O敏感指令的执行。,I/O敏感指令列表,2I/O许可位图,I/O许可位图就是一个二进制位串 位串中的每一位对应一个I/O地址 如果位串中的第n位为0,那么I/O地址n就可以由任何特权级的程序访问,而不加限制;如果第n位为1,I/O地址n只能由在IOPL特权级或更高特权级运行的程序访问。一条I/O指令最多可涉及4个I/O地址 这条指令用到的所有I/O

30、地址的许可位都必须为0,才允许访问,3对IOPL的保护,EFLAGS中的IOPL,VM和IF位不能随便更改只有在高特权级程序中执行的IRET,POPF,CLI和STI等指令才能改变它们,如图,10.4.4 编写驱动程序修改I/O位图,修改任务I/O位图的内核驱动程序举例:giveio.c 执行过程见书368页。,10.5 中断和异常,中断分为内部中断和外部中断两大类。外部中断通常称为“中断”;内部中断通常称为“异常”;通常在两条指令之间响应中断或异常;CPU最多处理256种中断或异常。,10.5.1 中断和异常的类型,1.中断中断是由异步的外部事件引起的,中断信号来自于CPU外部 CPU有两根

31、引脚INTR和NMI接受外部中断请求信号。INTR接受可屏蔽中断请求NMI接受不可屏蔽中断请求,标志寄存器EFLAGS中的IF标志决定是否响应INTR的中断请求 IF=0时,CPU不响应INTR信号CPU在响应中断请求时,从外部硬件读出一个8位的中断类型号,来区分外部中断的来源。对来自NMI的中断请求,CPU不检查IF标志。在响应NMI中断时,不从外部硬件接收中断类型号,其中断类型号固定为2。,2.异常,异常是CPU在执行指令期间检测到不正常的或非法的操作所引起的 发生异常时,在对该异常处理完毕前,引起该异常的指令就不能成功地被执行;异常发生后,处理器,根据异常号码,转到相应的异常处理程序。根

32、据引起异常的程序是否可被恢复和恢复点的不同,把异常分为:故障陷阱 中止,故障,故障是在引起异常的指令之前,把异常情况通知给系统的一种异常。故障是可排除的。当控制转移到故障处理程序时,在堆栈中保存的断点CS及EIP的值指向引起故障的指令。在故障排除后,执行IRET可以返回到引起故障的程序。,陷阱,陷阱是在引起异常的指令执行之后触发的一种异常。陷阱处理后,要返回到引起陷阱的指令的下一条指令。,中止,中止是在系统出现严重的不可恢复的事件时触发的一种异常。产生中止后,系统要重新启动才能恢复正常运行状态。,2异常类型号,每一种异常被赋予一个异常类型号 某些异常以出错码的形式提供一些附加信息传递给异常处理

33、程序 一个号码如果已经作为异常类型号,就不能再作为中断类型号使用。异常类型号列表见书371页,3故障类异常,(1)除法出错故障(异常0)当执行DIV指令或IDIV指令时,如果除数等于0或者除数太小,以至于得到的商超过了操作数能容纳的范围,那么就产生这一故障。除法出错故障没有出错码。(2)边界检查故障(异常5)如果BOUND指令发现被测试的值超过了指令中给定的范围,那么就发生边界检查故障。边界检查故障不提供出错码。,故障类异常,(3)非法操作码故障(异常6)如果CS和EIP所指向的不是一个合法的指令,那么就发生非法操作码故障。有下列情况:操作码字段的内容不是一个合法的CPU指令代码;要求使用内存

34、操作数的场合,使用了寄存器操作数;不能被加锁的指令前使用了LOCK前缀。非法操作码故障不提供操作码。,故障类异常,(4)无浮点处理器故障(异常7)这个故障用来模拟数字协处理器。该故障在下列两种情况下产生:执行浮点指令时,控制寄存器CR0中的EM位或TS位为1;执行WAIT指令时,控制寄存器CR0中TS位及EM位都为1。EM位为1,CPU必须用整数指令来模拟符点计算;TS位为1,CPU必须将上一个任务的浮点运算现场保存起来,再恢复当前任务浮点运算的现场。,故障类异常,(5)无效TSS故障(异常0AH)当发生任务切换时,需要使用任务状态段TSS。如果当前程序的特权级不能访问该TSS,或者TSS中保

35、存的LDTR,CS,DS等寄存器不正确,就发生无效TSS故障。无效TSS故障提供了一个出错码,格式,故障类异常,高13位是选择符的索引部分;TI位是选择符的TI位;EXT位等于1时,表示故障由外部事件引起。IDT位等于1时,表示故障由于读取IDT表引起。引起无效TSS故障的原因如下:TSS描述符中的段限长小于103;无效的LDT描述符,或者LDT描述符的P位为0;堆栈段不是一个可写段;堆栈段选择符索引的描述符超出描述符表界限;,故障类异常,引起无效TSS故障的原因如下(续):堆栈段DPL与新的CPL不匹配;堆栈段选择符的RPL不等于CPL;代码段选择符索引的描述符超出描述符表界限;代码段选择符

36、不指向代码段;非一致代码段的DPL不等于新的CPL;一致代码段的DPL大于新的CPL;对应DS,ES,FS或GS的选择符指向一个不可读段(如系统段);对应DS,ES,FS或GS的选择符索引的描述符超出描述符表的界限。,故障类异常,(6)段不存在故障(异常0BH)在给CS,DS,ES,FS或GS赋值时(不含SS),如果发现这些段寄存器指向的段描述符其他字段的值有效,而P位为0,产生段不存在故障。段不存在故障提供了一个包含引起该故障的段选择符的出错代码。,故障类异常,(7)堆栈段故障(异常0CH)当处理器检测到与SS段有关的问题时,就发生堆栈段故障。出现故障的情况如下:在堆栈操作时,偏移超出段界限

37、所规定的范围。出错码为0。在由特权级变换所引起的对高特权级堆栈的操作时,偏移超出段界限所规定的范围,高特权级堆栈段的段描述符中的P位为1。此时出错码中包含高特权级堆栈的选择符。装入到SS寄存器的段描述符中的P位为0。此时出错码中包含有对应的选择符。,故障类异常,(8)通用保护故障(异常0DH)除了明确列出的段异常外,其他的段异常都被视为通用保护故障。通用保护故障可分为如下两类:违反保护方式,但程序无需中止的异常。出错码为0 违反保护方式,并导致程序终止的异常。出错码可能为0,也可能不为0。,故障类异常,(9)页故障(异常0EH)启用分页机制后,线性地址要经过分页机制转换才能成为物理地址。转换过

38、程中出现异常的原因:页目录表项或页表项中的P=0,对应的物理页不在内存中;发现试图违反页保护属性(U/S,R/W)的规定而对页进行访问。提供出错码,故障类异常,(10)协处理器出错(异常10H)协处理器出错故障指示协处理器发生了未被屏蔽的数字错误,如上溢或下溢。协处理器出错故障不提供出错码。,4陷阱类异常,调试陷阱 断点陷阱 溢出,调试陷阱,调试异常有故障类型,也有陷阱类型 调试异常不提供出错码。几种陷阱如下:,断点陷阱,调试程序可利用“INT 3”指令实现程序断点。“INT 3”指令被看成是一种陷阱,而不是一个故障。“INT 3”陷阱不提供出错码。,溢出,INTO指令提供有条件的陷阱,如果O

39、F标志为1,那么INTO指令产生陷阱;否则不产生陷阱,继续执行INTO后面的指令。溢出陷阱不提供出错码。,5中止类异常,(1)双重故障异常(异常8)当系统正在处理一个异常时,如果又遇到另一个不能处理的异常,CPU就产生一个双重故障,双重故障属于中止类异常,出错码为0。当正处理一个段故障异常时,又产生一个页故障。这时通知给系统的是一个页故障异常。如果正在处理一个段故障或页故障时,又一个段故障被检测到,或者如果正处理一个页故障时,又一个页故障被检测到,那么就引起双重故障。,中止类异常,双重故障通常指示系统表出现严重的问题,需要重启系统。(2)协处理器段越界(异常9)协处理器段越界异常也属于中止类异

40、常,引起该异常的指令不能被重新执行。当浮点指令操作数超出段界限时,产生该异常。协处理器段越界异常不提供出错码。,10.5.2 中断门和陷阱门,中断描述符表IDT所含的描述符只能是中断门、陷阱门和任务门。中断门,中断门和陷阱门,陷阱门任务门前面已有介绍。,10.5.3 中断和异常的处理过程,在中断或异常产生后,CPU依据中断类型号或异常号进行中断响应或异常处理。步骤如下:(1)如果是异常处理,首先根据异常类型确定返回地址。如果有出错代码,则按照出错码格式构造出错码,并把出错码压入堆栈。对于故障,CS:EIP指向引起故障的指令;对于陷阱,CS:EIP指向引起陷阱的指令的下一条指令。,中断和异常的处

41、理过程,(2)判断中断类型号要索引的门描述符是否超出IDT的界限。若超出界限,就触发通用保护故障,出错码如右:(3)再从IDT中取得对应的门描述符,分解出选择符、偏移量和属性字节,并进行有关检查。,中断和异常的处理过程,如果是由INT n指令或INTO指令引起转移,还要检查该描述符中的DPL是否满足CPLDPLGATE;对于其他的异常或中断,则不检查CPLDPLGATE条件。(4)根据门描述符类型,分别转入中断或异常处理程序。如果门描述符是中断门或陷阱门,那么控制转移到当前任务的一个处理程序过程,并且可以变换特权级,从中断门和陷阱门中获取指向处理程序的48位地址指针(16位段:32位偏移)。如

42、果门描述符是任务门,后面的章节会讲到。,中断和异常的处理过程,取得48位地址指针后,CPU执行以下步骤:(1)若段选择符为0,则产生通用保护故障;(2)在GDT/LDT中取对应的描述符;(3)若描述符不是一个代码段描述符,则产生通用保护故障;(4)若代码段(C0)且DPLCPL,则产生通用保护故障;(5)调整段选择符的RPL0(不修改门中的段选择符,在CPU内部调整);,中断和异常的处理过程,(6)把段选择符装入CS;(7)若偏移超过段长,则产生通用保护故障;(8)EFLAGS压入堆栈;(9)CS压入堆栈;EIP压入堆栈;这里的 CS:EIP是指中断/异常的返回地址;(10)置TF0,NT0;

43、(11)若为中断门,则使IF0;(12)若有出错码,则把出错码压入堆栈;(13)把偏移装入EIP,跳转到处理程序。,中断和异常的处理过程,中断或异常可以转移到同一特权级或高特权级。是否要转移到高特权级,由代码段的描述符中的类型(C位)及DPL字段决定:如果C位=1(一致性代码段),则不改变特权级。如果C位=0(非一致性代码段)且DPLCPL,产生通用保护异常,因为不能通过中断或异常而降低特权级。,中断和异常的处理过程,通过中断门的转移和通过陷阱门的转移之间的差别只是对IF标志的处理。对于中断门,在转移过程中把IF置为0;对于陷阱门,在转移过程中保持IF位不变。,中断和异常的处理过程,在有出错码

44、的情况下,转入处理程序之前还要把出错码压入堆栈。下面给出四种情况:第1,3种情况没有出错码;第2,4种情况有出错码。,10.5.4 通过任务门的转移,如果以中断类型号为索引,在中断描述符中取出的是一个任务门描述符,那么控制转移到新的任务。将任务门放在IDT表中,在响应对应的中断或异常时,可根据该任务门实现任务的自动调度。这种任务调度由CPU直接执行,速度快,开销小。,各种转移方式的比较,第一种情况(使用中断门或陷阱门)没有进行任务切换 对当前任务的状态可直接进行访问 处理程序必须存在于当前任务的地址空间中,第二种情况(使用任务门)要进行任务切换转移到处理程序要花费较长时间 访问原任务的状态较为

45、复杂,3中断或异常处理后的返回,指令IRET用于从中断或异常处理程序中返回。该指令的执行根据任务嵌套标志NT位是否为1分为两种情形:NT位为1时,IRET执行的是嵌套任务的返回。这种情形在通过任务门转入的处理程序返回时出现。NT位为0时,IRET执行的是当前任务内的返回。这种情形在通过中断门或陷阱门转入的处理程序返回时出现,4各种转移途径的总结,JMP、CALL、INT和IRET指令都可以引起任务切换。这些切换是主动的任务切换;在执行这些指令时,转移到一个新的任务。中断和异常引起的任务切换是被动的任务切换。可能在程序执行的任何时候发生。,任务内特权级变换的途径如下图,任务内相同特权级转移如下图

46、,10.5.5 结构化异常处理,构化异常处理,是Windows操作系统提供处理程序错误或异常的机制。例如C/C+中的_try,_finally和_try,_except 等功能 举例:C语言的结构化异常处理程序seh.c 汇编程序捕获并处理异常程序except.asm,10.6 虚拟8086模式,V86模式是保护模式下的一种工作方式。寻址的地址空间是1MB,地址为20位;程序中使用的内存地址由两部分构成:16位段和16位偏移。在保护模式下,当标志寄存器EFLAGS中的VM位为1时,处理器就处于V86模式。,1虚拟8086任务,V86监控程序和在V86模式下的8086程序构成的任务称为虚拟808

47、6任务,即V86任务。V86任务形成一个由处理器硬件和监控程序组成的“虚拟8086”。V86监控程序控制V86外部界面、中断和I/O。CPU把V86任务作为与其他任务具有同等地位的一个任务。V86任务中,V86程序在V86模式下运行,而V86监控程序在保护模式下运行,2内存映射,在V86模式下,程序只能使用1MB的内存。由段值乘以16加上偏移构成20位地址,这是线性地址。经过转换后,得到物理地址。CPU可同时运行多个V86任务,这些任务的内存被映射到不同的物理内存上,相互之间互不影响。,3V86模式下的敏感指令,指令CLI和STI的敏感条件不变,如果IOPL3,那么执行CLI或STI指令将引起

48、通用保护故障。输入/输出指令IN,INS,OUT或OUTS是否执行由I/O许可位图对应位决定。如果输入/输出指令所使用的I/O地址对应的I/O许可位图内的各位都为0,则输入输出指令可正常执行,否则引起通用保护故障。,10.6.2 虚拟8086模式的进入和退出,保护模式和V86模式之间的切换如图,虚拟8086模式的进入和退出,离开V86模式(2种)在V86任务内离开V86模式任务切换离开V86模式进入V86模式(2种)通过IRET指令进入V86模式通过任务切换进入zV86模式,10.7 操作系统类指令,系统指令可分为以下几类:在实模式和任何特权级下可执行的指令仅在实模式及特权级0下可执行的指令仅

49、在保护模式下可执行的指令课本394和395页列出了这些指令,10.7.1 在实模式和任何特权级下可执行的指令,1读取全局描述符表寄存器指令格式:SGDT QWORD PTR DST功能:把全局描述符表寄存器GDTR的内容保存到内存单元DST。说明:DST是48位的内存操作数。GDTR中的16位限长存入DST的低字,而32位基地址存入DST的高双字。,在实模式和任何特权级下可执行的指令,2读取中断描述符表寄存器指令格式:SIDT QWORD PTR DST功能:把中断描述符表寄存器GDTR的内容保存到内存单元DST。说明:DST是48位的内存操作数。IDTR中的16位限长存入DST的低字,而32

50、位基地址存入DST的高双字。,在实模式和任何特权级下可执行的指令,3读取机器状态字指令格式:SMSW DST功能:把机器状态字的内容保存到内存单元或寄存器中。说明:DST可以是16位的内存操作数或寄存器;机器状态字是CR0的低16位。,在实模式和任何特权级下可执行的指令,4读取性能计数器指令格式:RDPMC功能:读取由ECX指定的40位时间戳计数器,放入EDX:EAX中。说明:EDX存放模式寄存器的高8位,EAX存放模式寄存器的低32位。,10.7.2 仅在实模式及特权级0下可执行的指令,1清任务切换标志指令格式:CLTS功能:把CR0控制寄存器中的TS标志清零。说明:TS标志置为1,表示已发

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号