你的位置:首页 > 软件开发 > 操作系统 > intel手册

intel手册

发布时间:2016-05-06 20:00:14
这节描述了IA-32架构的任务管理功能,只有当处理器运行在保护模式的时候,这个功能才是有效的,这节的侧重点在32位任务和32位TSS结构上,关于16位的任务和16位TSS结构,请看7.6节,关于64位模式中,具体任务管理的信息,请看7.7节 7.1 任务管理概述 ...

intel手册

       这节描述了IA-32架构的任务管理功能,只有当处理器运行在保护模式的时候,这个功能才是有效的,这节的侧重点在32位任务和32位TSS结构上,关于16位的任务和16位TSS结构,请看7.6节,关于64位模式中,具体任务管理的信息,请看7.7节

 7.1 任务管理概述

       任务是处理器可以调度,执行和暂停的一个工作单元,它可以执行一个程序,任务,进程,操作系统服务程序,中断例程,异常例程,内核实用程序

      32位架构提供了一种机制,可以保存任务状态,调度要执行的任务,并且切换一个任务到另一个任务,当操作系统位于保护模式的时候,所有处理器的执行都发生在任务中,即使简单的操作系统,也必须定义至少一个任务,复杂的操作系统可以使用处理器的任务管理功能来支持多任务程序

   7.1.1  任务结构

        任务由两部分组成,任务执行空间和任务状态段(TSS),任务执行空间由一个代码段,一个栈段和一个或者更多的数据段组成,如果一个操作系统或者可执行程序使用了处理器的权限级保护机制,那么任务执行空间也提供了一个分开的栈为每种权限级

    TSS指定了组成任务执行空间的段和为任务状态信息提供了存储空间,在多任务系统中,TSS也提供了一种链接任务机制    

    任务是由它的TSS段选择子定义的,当处理器加载一个任务并且执行的时候,段选择子,基址,界限和TSS段描述符属性加载进TR中(细看2.4.4),如果任务执行在分页模式中,那么任务使用的页目录基址则被加载进CR3中

7.1.2  任务状态

     下面几项定义了当前正在执行任务的状态

       1.  由段寄存器中的段选择子定义的任务的当前执行空间(CS DS SS ES FS GS)

      2.   普通寄存器的状态

      3.   EFLAGS寄存器的状态

      4.   EIP寄存器的状态

     5.    CR3寄存器的状态

     6.   TR寄存器的状态

     7.   LDTR寄存器的状态

     8.   IO映射基址和IO映射(存在于TSS中)

     9.   特权级0,1, 2的栈指针(存在于TSS中)

     10.  链接上一个执行任务(存在于TSS中)

     在调度一个任务之前,除了TR寄存器状态,上面的所有信息都被包含在TSS中,同样,LDTR寄存器的所有内容都不保存在TSS中,仅仅LDT的段选择子存在

7.1.3   执行一个任务

     软件或者处理器可以利用下面的方法调度一个任务去执行

     1.  显式的利用CALL指令调用一个任务

     2.  显式的利用JMP指令跳转到任务中

     3.   显式的调用一个中断处理程序任务(通过处理器)

     4.  显式的调用一个异常处理程序任务

     5.   一个return (一个IRET指令),当EFLAGS寄存器中的NT标志置1的时候

        以上所有的调度一个任务的方法标识着任务被调度,并且段选择子指向了一个任务门或者任务的TSS,当用CALL指令或者JMP指令调度一个任务的时候,指令中的选择子可以直接选择一个TSS或者保存TSS选择子的任务门,当调度一个任务处理一个中断或者异常的时候,IDT项必须包含一个保存中断或者异常处理程序TSS的选择子任务门

    

       当任务将要被调度执行的时候,任务切换就发生在当前正在执行的任务和被调度的任务之间,在任务切换期间,当前正在执行任务的执行环境(任务的状态或者上下文)被保存在它的TSS中并且任务被暂停,被调度任务的执行环境被加载进处理器中,并且刚刚加载的EIP寄存器指向了任务开始执行的指令,如果从上次系统初始化后,任务没有运行,EIP将执行任务代码的第一条指令,否则,当任务上次是active的时候,它将指向上次任务执行后的指令的后一条指令

      如果当前正在执行的任务(calling task)被正在调度的任务(called task)调用,那么calling task的段选择子则被保存在called stack的TSS中,作为link back提供给calling task

       对于所有的32位处理器来说,任务都不是递归的,一个任务不能CALL或者JMP它自己

      中断和异常能被Handler task的任务切换处理,处理器执行一个任务切换去处理中断或者异常,并且返回的时候自动从一个中断程序任务或者异常程序任务切换回到被中断的程序,这种机制也能处理发生在中断任务期间的中断

      作为任务切换的一部分,处理器也能切换到另一个LDT,LDT-BASED段中,允许每个任务都有一个逻辑地址到物理地址的映射,任务切换的时候,页目录基址寄存器CR3会重新加载,允许每个任务有它自己的页表,这种保护机制帮助了任务之间的隔离,并且预防了任务之间的干扰

       如果保护机制不被使用,处理器不会提供任务之间的保护,即使操作系统使用了多种权限级保护,一个任务运行在R3 ,使用与其他R3任务相同的LDT和页表,访问代码,错误的数据和其他任务的栈

       使用任务管理功能来处理多任务应用程序是可选的,多任务能在软件中处理,每个软件定义的任务都执行在单IA-32架构任务的上下文中




7.2  任务管理数据结构

     处理器定义了五种与任务相关的数据结构

    1.   任务状态段 (TSS)

    2.   任务门描述符

    3.   TSS描述符

    4.   任务寄存器

    5.   EFLAGS寄存器中的NT  Flag

    当在保护模式的时候,在最少一个任务时,一个TSS或者TSS描述符必须被创建,并且TSS的段选择子必须被加载到TR寄存器中

       

7.2.1   任务状态段-TSS

        任务需要恢复的处理器状态信息,保存在叫做系统段的TSS中,图片7-2显式了32位CPU下,任务的TSS格式,TSS字段主要分为两类:动态字段和静态字段

intel手册

        任务切换期间,当一个任务被暂停的时候,处理器会更新动态字段,下面的这些都是动态字段

        1.   普通寄存器字段: EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP

        2.   段寄存器字段:      CS DS ES SS FS GS

        3.   EFLAGS寄存器

        4.   EIP寄存器字段

        5.   上一个任务的链接字段:包含了上一个任务的TSS的段选择子(更新发生在call   interrupt  exception初始化造成的任务切换),这个字段(有时叫做back link字段)允许一个任务使用IRET指令返回到上一个任务

     处理器读取静态字段,通常不会改变它们,这些字段是任务创建的时候设置的,下面的是静态字段

       1.    LDT断选择子字段:包含了任务的LDT的段选择子

       2.    CR3控制寄存器字段: 包含了任务使用的页表的基址,总所周知,CR3也被叫做PDBR

       3.    权限级0  1  2栈指针字段:这些栈字段包含了栈段的段选择子(SS0  SS1  SS2)和栈内偏移(ESP0  ESP1  ESP2)组成的逻辑地址,对于特定任务,这些字段是静态的,如果栈切换发生在任务中,SS和ESP将会改变

      4.    T-FLAG(debug trap): 当设置这个flag的时候,当任务切换到这个任务的时候,T-flag会造成处理器产生一个调试异常

     5.     I/O位图基址字段:包含一个相对于TSS中的基址的16位偏移到I/O允许位图和中断重定向位图,当存在的时候,这些映射被存储在TSS中的较高地址,I/O映射基址指向了I/O允许位图的基址和中断重定向位图的结束

    如果分页被使用:

     1.  避免任务切换期间,处理器读取104个字节时,TSS存在于两个物理页(也就是页边界只有部分TSS),处理器可能执行不正确的地址翻译,任务切换期间,处理器读写每个任务的TSS的104字节(使用连续的物理地址作为TSS的第一个字节的物理地址),如果这104个字节不是物理连续的,处理器将会访问不挣钱的信息,而且也不会产生PF异常

    2.  上一个任务的和这次任务的TSS的物理页,和每一个描述符表项都应该标记为可读可写

    3.  在任务切换初始化的时候,如果包含这些结构的页面存在于内存中,任务切换会更快的执行

 




7.2.2   ​TSS描述符

       TSS类似于其他的段,是被段描述符定义的,图片7-3显式了TSS描述符的格式,TSS描述符只能位于GDT中,它不能位于LDT或者IDT中

       在CALL 和 JMP期间,试图用TI位为1(代表当前的LDT)的段选择子访问TSS会造成GP异常,在IRET的期间,会造成无效的TSS异常(#TS),试图加载TSS的段选择子到其他段寄存器也会造成GP异常

       类型字段的Busy-Flag标志着任务是否繁忙,繁忙的任务代表正在运行或者暂停,类型字段的值如果是1001B,代表的就是一个inactive的任务,如果类型字段是1011B,那么就代表是一个繁忙的任务,任务不会递归,处理器使用Busy-FLag检测一个试图调用执行已经被中断的任务,为了确保一个Busy-Flag只与一个任务相关,每个TSS应该只有一个TSS描述符指向它    

intel手册 

    基址,段界限,DPL, G,P的功能类似于数据段描述符中的使用,在32位TSS中,如果TSS描述符的G为0,limit的值必须大于等于67h, TSS的最小size大于1字节,试图切换一个TSS描述符的limit小于67h的任务,将会造成无效的TSS异常(#TS),如果包含一个I/O允许位图,或者操作系统存储了附加数据,那么Limit则被要求更大,在任务切换的时候,处理器并不会检测Limit是否大于67h, 然而当访问I/O允许位图或者中断重定向位图的时候,则会检查

    任何程序访问描述符都能用CALL或者JMP调度任务(程序CPL的数值要小于TSS描述符的DPL)

    在大多数系统中,TSS描述符的DPL的值要小于3,因此只有特权软件能执行任务切换,然而在多任务应用程序中,一些TSS描述符的DPL可能设置为3,允许任务切换发生在R3程序中

7.2.3   64模式下的TSS描述符

     64位模式下,任务切换不再受支持,但是TSS描述符仍然存在,TSS描述符扩展到了16字节,这个扩展也应用到LDT中,下图描述了系统类型字段的编码信息

 intel手册

7.2.4  任务寄存器

       任务寄存器保存16位段选择子和当前任务的TSS的整个段描述符(32位基址(IA32-E模式下是64位),16位段界限和描述符属性),这些信息是从当前任务GDT的段描述符中复制的,下图显示了处理器使用这些信息访问TSS的路径

intel手册

        任务寄存器有可见部分(能读和能被软件修改)和不可见部分(由处理器维护,软件是无法访问的),段选择子在可见部分,指向了GDT中的TSS描述符,处理器使用任务寄存器的不可见部分来缓存TSS的段描述符,缓存这些值到寄存器中可以使任务的执行更加高效,LTR(加载到任务寄存器)和STR(读取任务寄存器)指令加载和读取任务寄存器的可见部分

原标题:intel手册

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录