保护模式及其编程.ppt
第十四章 保护模式及其编程,保护虚拟地址模式(简称保护模式),32位的寄存器可用、可寻址4GB的物理地址空间逻辑物理地址转换过程包含两级:先分段再分页。(注:分页过程是可选的)为实现虚拟存储器提供了硬件支持支持多任务,能够快速地进行任务切换和保护任务环境包含4个特权级和完善的特权检查机制,对所有的内存和I/O访问操作都进行严格检查,能够屏蔽普通程序对系统、硬件和中断等资源的直接访问。不同的特权级下有不同的指令系统设置CR0的PE位为1可使系统进入保护模式,14.1保护模式下的的存贮管理,设置CR0的PG位可以开启(1)和关闭(1)分页机制保护模式中的逻辑地址(虚拟地址)由16位的选择子和32位的偏移量两部分组成。选择子放在段地址寄存器中,用来指定一个段描述符,选择子,偏移量,分段机制,线性地址,物理地址,分页机制,虚拟地址,15 0,31 0,分段机制实现了虚拟地址到线性地址的转换程序员在编写程序时,会定义数据段、代码段等多个逻辑段,分段管理机制就是用于管理这些段,并将二维的虚拟地址转化成一维的线性地址。段由 段描述符 来定义,其中存放了关于段的三个参数:(1)段基址(Base,32位)(2)段界限(Limit,20位)(3)段的属性(读/写/执行,特权级等)(12位)段描述符存放在描述符表中,选择子就是用来指定某个特定描述符的关于描述符表的索引,14.1.1分段管理,段选择子与存储段描述符,选择子的格式:(一般放在段寄存器中),描述符的格式:,A,描述符表,描述符可用于描述多种对象:存储段、任务状态段、调用门、任务门、中断门、陷阱门和LDT。为了便于组织管理,80386把描述符组织成线性表。由描述符组成的线性表称为描述符表。每个描述符表本身形成一个特殊的内存数据段。这样的特殊数据段最多包含8192个描述符。该段由操作系统维护、并由处理器中的存储管理单元硬件(MMU)访问。在80386中有三种类型的描述符表:全局描述符表GDT、局部描述符表LDT 和 中断描述符表IDT。在整个系统中,全局描述符表GDT和中断描述符表IDT只有一张,局部描述符表可以有若干张,每个任务有一张。,GDT和LDT,GDT含有每一个任务都可能访问的描述符,通常包含操作系统所使用的代码段、数据段和堆栈段的描述符,也包含多种特殊描述符,如LDT描述符。在任务切换时,并不切换GDT。通过GDT可以使各任务都需要的段能够被共享。每个任务的局部描述符表LDT含有该任务自己的代码段、数据段和堆栈段的描述符,也包含该任务所使用的一些门描述符,如任务门和调用门描述符等。随着任务的切换,系统当前的局部描述符表LDT也随之切换。通过LDT可以使各个任务私有的各个段与其它任务相隔离,从而达到受保护的目的。选择子的TI位为0表示它所访问的描述符在GDT中,为1表示描述符在LDT中。,GDT和LDT,GDTR、LDTR,GDT和IDT的基地址分别存放在GDTR和IDTR中,而各个LDT的基地址存放在GDT的LDT描述符中。LDTR是当前所使用的LDT描述符的选择子。GDTR和IDTR长48位,高32位为基地址,低16位为界限。LDTR类似于段寄存器,存储的是当前所使用的LDT表的LDT描述符的选择子。任务状态段寄存器TR包含指示描述当前任务的任务状态段的描述符选择子,从而规定了当前任务的状态段。,虚拟线性地址转换过程,基本过程:通过虚拟地址中的选择子在描述符表中找到相应的段描述符,取出其中的32位段基地址,该基地址加上虚拟地址中偏移量就形成了线性地址。当然,在相加之前要根据描述符中的Limit字段判断一下该偏移量是否越界。,选择子,偏移地址,段基址,段界限,段属性,+,虚拟地址,从GDT或LDT中得到的段描述符,线性地址,例:MOV EAX,DS:EDX设描述符表的基地址存放在GDTR中,则转换结果为:(GDTRDS8).Base+EDX注:A表示取A所指向的内存单元的内容,分页机制在分段机制之后进行操作,以完成线性地址到物理地址的转换过程。保护模式下,CR0中的PG位控制分页管理机制是否生效。分页机制把线性地址空间和物理地址空间分别划分为大小相同的块。这样的块称之为页。通过在线性地址空间的页与物理地址空间的页之间建立的映射,分页机制实现线性地址到物理地址的转换。在80386中,页的大小固定为4K字节,每一页的边界地址必须是4K的倍数。因此,4G大小的地址空间被划分为1M个页,每个页的起始地址用20位记录。线性地址的低12位经过分页机制直接作为物理地址的低12位使用。页映射函数可看成是把线性地址的高20位转换为对应物理地址高20位的转换函数。,14.1.2 分页管理,两级页表结构,页映射表的第一级称为页目录表,存储在一个4K字节的物理页中。页目录表共有1K个表项,其中,每个表项为4字节长,包含对应第二级表所在物理地址空间页的基地址。页映射表的第二级称为页表,每张页表也安排在一个4K字节的页中。每张页表都有1K个表项,每个表项为4字节长,包含对应物理地址空间页的基地址。由于页目录表和页表均由1K个表项组成,所以使用10位的索引就能指定具体表项,即用10位的索引值乘以4加基地址就得到了某个表项的物理地址。任务切换时,页目录表和页表也要相应进行切换,使得不同任务的线性地址空间被映射到不同的物理地址空间中。当前页目录表的物理基地址存放在CR3寄存器中。,两级页表结构,表项格式,P位表示该表项是否有效。P=1表项有效;P=0表项无效。在通过页目录表和页表进行地址转换过程中,无论在页目录表还是在页表中遇到无效表项,都会引起缺页异常。处理器在访问过某个表项之后总是将其A位置1。一般由操作系统将其周期性的刷新为0。处理器在对某个物理页进行过写操作之后,总是将其所对应的页表中表项的D位置1。U/S和R/W位用于对页进行保护。,线性地址到物理地址的转换,14.1.2 虚拟存贮器,虚拟存储器是一项硬件和软件结合的技术。存储管理部件把物理存储器和辅存储器看作是一个 整体,即虚拟存贮器。虚拟存贮器容量可达64T32位处理器的分段、分页存贮管理机制从硬件上 很好地支持了虚拟存贮器的实现。,14.1.3 保护机制,为了支持多任务,从80286开始,处理器就具备了保护机制。不同任务之间的保护和共享 通过把每个任务放置在不同的虚拟地址空间的方法,来达到应用程序之间保护的目的。2同一任务内的段级保护 在段级保护中使用了三种形式的特权管理:当前特权级(CPL)描述符特权级(DPL)请求特权级(RPL)。3同一任务内的页级保护 页目录表和页表的表项中的保护属性位R/W和U/S就是用于对页进行保护。,14.2 保护模式下的程序调用和转移,保护模式下的调用和转移可分为两大类:同一任务内的调用和转移任务间的调用和转移(任务切换)。同一任务内的调用和转移又可分为:段内调用和转移、段间调用和转移。,14.2.1 系统段描述符、门描述符和任务状态段,每个任务都有自己的局部描述符表LDT。另外每个任务还有一个任务状态段TSS,用于保存任务的有关信息。LDT和TSS作为系统的一个特殊段,由系统段描述符描述,描述符存放在GDT中。,段界限(位70),段界限(位158),段基址(位70),段基址(位158),段基址(位2316),段属性,段属性,段界限(位1916),段基址(位3124),0,1,2,3,4,5,6,7,0,7,系统段描述符的格式,位7,P,DPL,DT=0,TYPE,位6,位5,位4,位3,位2,位1,第5字节,位0,位7,G,AVL,段界限(位1916),位6,位5,位4,位3,位2,位1,第6字节,位0,0,系统段描述符的属性,系统段描述符,偏移地址(位70),偏移地址(位158),选择子(位70),选择子(位158),门属性,门属性,偏移地址(位2316),双字计数,偏移地址(位3124),0,1,2,3,4,5,6,7,0,7,门描述符的格式,第4字节,位7,0,双字计数,位6,位5,位4,位3,位2,位1,第5字节,位0,门描述符的属性,0,0,门描述符,门描述符并不描述某种内存段,而是描述控制转移的入口点。通过这种门,可实现任务内特权级的变换和任务间的切换。门描述符又可分为:任务门、调用门、中断门和陷阱门。调用门 描述某个子程序的入口,通过调用门可实现任务内从低特权级变换到高特权级。任务门指示任务 通过任务门可实现任务间切换。中断门和陷阱门 描述中断/异常处理程序的入口点。,任务状态段,任务状态段(Task State Segment)是保存一个任务重要信息的特殊段。当前任务的任务状态段可由任务状态段寄存器TR寻址。TSS在任务切换过程中起着重要作用,通过它实现任务的挂起和恢复。任务切换是指,挂起当前正在执行的任务,恢复或启动另一任务的执行。TSS的基本格式由104字节组成,分为链接字段、内层堆栈指针、地址映射寄存器、寄存器保存和其它字段等五个区域。,14.2.2 任务内的段间转移,1 任务内无特权级变换的转移JMP和CALL分为段间直接转移和段间间接转移两类。段间直接转移:指令JMP和CALL在指令中直接含有目标地址指针。例:JMP XX:YY、CALL XX:YY其中XX是16位代码段选择子,YY是偏移地址。,利用段间直接转移指令JMP或调用指令CALL只能进行任务内无特权级变换的转移。,任务内无特权级变换的转移(1)处理器在执行段间直接转移指令时,首先通过段选择子从全局描述符表或局部描述符表中取得目标代码段描述符,装载到CS高速缓冲寄存器;(2)然后将段选择子装入CS段寄存器,偏移地址装入指令指针寄存器EIP,CPL存入CS内选择子的RPL字段;(3)如果是执行CALL指令,还需将返回地址指针压栈,从而完成向目标代码段的转移。,2任务内特权级变换的转移,段间间接转移:指令JMP和CALL在指令中含有指向包含目标地址指针的门描述符或TSS描述符的指针。例 JMP XX:YY、CALL XX:YY其中XX不再是16位代码段选择子,而是一个门选择子;偏移地址YY没有使用。,在同一任务内,实现特权级从低到高变换的方法是利用CALL指令,通过调用门进行转移。实现特权级从高到低变换的方法是利用RET指令。JMP指令只能实现无特权级变换的转移,不能实现任务内不同特权级的变换。,CALL 选择子:偏移地址,调用门,选择子:偏移地址,目标代码段描述符,段基址,子程序RET,目标代码段,GDT/LDT,使用调用门的转移过程,14.2.3 任务间的转移,利用段间转移指令JMP或者段间调用指令CALL,通过任务门或直接通过任务状态段,可以进行任务间的转移,即任务切换。在中断/异常或者执行IRET指令时也可能发生任务切换。因为RET指令的目标地址只能使用代码段描述符,所以,不能通过RET指令实现任务切换。,80386把外部中断称为“中断”,把内部中断称为“异常”。中断又可分为可屏蔽中断和不可屏蔽中断,异常又分为故障、陷阱和中止。向量是通过中断门或者陷阱门给出的,中断门或者陷阱门位于中断描述符表IDT中,中断描述表地址是由IDTR(中断描述表寄存器)给出。,14.3 保护模式下的的中断与异常,中断描述表IDT,整个系统只有一个中断描述符表IDT,最大长度是2K。中断描述符表寄存器IDTR指示IDT在内存中的位置,IDTR是48位的寄存器,其中高32位为基址,低16位为界限。中断描述符表IDT所含的描述符只能是中断门、陷阱门和任务门。在保护模式下,CPU只有通过中断门、陷阱门或任务门才能转移到对应的中断或异常处理程序。门描述符是8个字节长,因此中断或异常产生时,CPU以中断号乘8从IDT中取得对应的门描述符,分解出选择子、偏移量和描述符属性类型,并进行有关检查。最后,根据门描述符类型是中断门、陷阱门还是任务门,分情况转入中断或异常处理程序。,14.4 保护模式下的的输入/输出保护,80386采用I/O特权级IPOL和I/O许可位图的方法来控制输入/输出,实现输入/输出保护。IOPL存放在标志寄存器EFLAG中,它规定了可以执行所有与I/O相关的指令和访问I/O空间中所有地址的最低特权级。只有当CPL IOPL时,如果该指令所访问的I/O地址所对应的当前任务的I/O许可位为0,则80386允许该I/O操作,如果I/O许可位为1,则禁止该I/O操作。IOPL的设置和I/O许可位图的创建只能由操作系统进行。,14.5 操作系统类指令,14.5.1 实模式和任何特权级下可执行的指令,(1)存储全局描述符表寄存器指令格式:SGDT QWORD PTR 目标操作数说明:目标操作数是48位(6字节)的存储器操作数。功能:把全局描述符表寄存器GDTR的内容存储到目标操作数。(2)存储中断描述符表寄存器指令格式:SIDT QWORD PTR目标操作数说明:目标操作数是48位(6字节)的存储器操作数。功能:把中断描述符表寄存器IDTR的内容存储到目标操作数。,14.5.2 实模式和在特权级0下可执行的指令(1)装载全局描述符表寄存器指令格式:LGDT QWORD PTR 源操作数说明:源操作数是48位(6字节)的内存操作数。功能:把源操作数装入到全局描述符表寄存器GDTR中。(2)装载中断描述符表寄存器指令格式:LIDT QWORD PTR源操作数说明:源操作数48位(6字节)的内存操作数。功能:把存储器中的源操作数装入到中断描述符表寄存器IDTR中。,(3)控制寄存器数据传送指令格式:MOV 目标操作数,源操作数说明:控制寄存器数据传送指令实现CPU的控制寄存器和32位通用寄存器之间的数据传送。(4)清任务切换标志指令格式:CLTS说明:每当任务切换时,控制寄存器CR0的任务切换标志TS被自动置1。CLTS指令的功能是将TS标志清0。,14.5.3 只能在保护模式下执行的指令,(1)装载局部描述符表寄存器指令格式:LLDT 源操作数说明:源操作数可以是16位通用寄存器或内存操作数。功能:把源操作数中的内容作为指示局部描述符表LDT的选择子装入到LDTR寄存器。(2)存储局部描述符表寄存器指令格式:SLDT 源操作数说明:源操作数可以是16位通用寄存器或内存操作数。功能:把局部描述符表寄存器LDTR的内容存储到源操作数。,(3)装载任务寄存器指令格式:LTR 源操作数说明:源操作数可以是16位通用寄存器或内存操作数。功能:将源操作数作为指向TSS描述符的选择子装载到任务寄存器TR。(4)存储任务寄存器指令格式:STR 源操作数说明:源操作数可以是16位通用寄存器或内存操作数。功能:把TR所含的指向当前任务TSS描述符的选择子存储到源操作数。,