设为首页 加入收藏

TOP

pre-empting taskintel手册-Chapter7-Task Management(三)
2017-10-11 18:26:45 】 浏览:3110
Tags:pre-empting taskintel 手册 -Chapter7-Task Management
字节,试图切换一个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中,下图描述了系统类型字段的编码信息

 

7.2.4  任务寄存器

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

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

      LTR指令加载一个段选择子到任务寄存器,并且指向了一个GDT中的TSS描述符,然后它从TSS描述符加载信息到任务寄存器的不可见部分,LTR是个特权级指令,只有CPL为0的时候才能被执行,它被用于系统初始化期间,把一个初始化的值push到任务寄存器,然后当任务切换发生的时候,任务寄存器的内容被隐式的改变

 

       STR指令存储任务寄存器的可见部分到普通寄存器或者内存中,为了确定当前正在执行的任务,执行这条指令的代码能被用在任何特权级上,通常,它只被操作系统软件使用

     处理器在加电或者充值的时候,段选择子和基址默认设置为0,limit被设置为FFFFh

7.2.5   任务门描述符

     任务门描述符提供了一个间接的,被保护的任务,它能位于GDT, LDT 或者IDT中,任务门描述符的段选择子字段,指向了一个GDT中的TSS描述符,这个段选择子的RPL不被使用

     在一个任务切换期间,任务门描述符的DPL控制了TSS描述符的访问,当一个程序通过任务门,执行CALL或者JMP到一个任务,任务门选择子的CPL和RPL字段指向的任务门必须小于或者等于任务门描述符的DPL,当一个任务门被使用的时候,目标TSS描述符的DPL则不被使用

      任务可以被任务门描述符和TSS描述符访问,这些结构都满足下列需要

      1.  一个任务需要只有一个busy-flag:因为一个任务的busy-flag是存储在TSS描述符中,每个任务应该只有一个TSS描述符,然而,几个任务门可能会引用同一个TSS描述符

     2.  需要提供对任务的选择性访问:任务门满足这个需要,因为它们可以存在于LDT中,并且他们的DPL与TSS描述符的DPL不同,程序没有足够的权限来访问GDT中一个任务的TSS描述符,但是可能通过任务门的更高DPL的任务门允许访问任务,对于限制特殊任务的访问,任务门给出了更大的范围

     3.  需要通过一个独立的任务处理中断或者异常:任务门也可以存在于IDT中,允许中断和异常被任务处理程序处理,当一个中断或者异常向量指向了一个任务门的时候,处理器会切换到指定的任务

     下图展示了GDT中的任务门,LDT中的任务门,IDT中的任务门如何指向同一个任务的

     

 

7.3  任务切换

      下面几种情况,处理器回转移到另外一个任务执行

        1.  当前的程序或者任务执行了一个CALL 或者 JMP指令到一个GDT的TSS描述符

        2.  当前程序或者任务执行一个CALL或者JMP指令到一个GDT或者当前LDT的任务门描述符中

        3.  一个中断或者异常向量指向了一个IDT中的任务门描述符

        4.  档EFLAGS寄存器的NT flag置1的时候,当前任务执行了一个IRET指令

        JMP,CALL,IRET指令与中断和异常一样,都是重定向到一个程序的机制,引用一个TSS描述符或者一个任务门(calling或者Jmping到一个任务)或者NT flag的状态(当执行一个IRET指令的时候),取决于是否一个任务切换发生了

      当切换到一个新的任务的时候,处理器执行以下操作

      1.  从一个任务门或者上一个任务的link字段(使用IRET指令初始化的任务),获得新任务的TSS段选择子作为JMP或者CALL指令的操作数

      2.  检查当前任务是否被允许切换到一个新任务,数据访问特权规则应用与JMP和CALL指令,当前任务的CPL和新任务段选择子的RPL必须小于或者等于TSS描述符或者被引用的任务门的DPL。异常,中断(除了INT N指令产生的中断),和IRET指令被允许任务切换不管目标任务门或者TSS描述符的DPL如何,关于INT n指令产生的中断,DPL是被检查的

      3.  检查新任务的TSS描述符被标记为存在,并且有一个有效的界限(limit必须大于或者等于67h)

      4.  检查新任务是available(call  jmp  异常或者中断)或者busy(IRET返回)

      5.  检查被用于任务切换的,当前TSS,新的TSS和所有的段描述符 在系统内存中是分页的

      6.  如果任务切换是一个JMP或者IRE

首页 上一页 1 2 3 4 5 下一页 尾页 3/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于消息队列 下一篇初始Winsock编程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目