您的位置:首页 > 运维架构 > Linux

<<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.7 任务管理

2016-12-05 01:33 761 查看
        任务(Task)是处理器可以分配、调度、执行和挂起的一个工作单元。

        任务切换会把控制权完全转移到一个新的执行环境,即新任务的执行环境。这种转移操作要求保存处理器中几乎所有寄存器的当前内容,包括标记寄存器EFLAGS和所有段寄存器。任务切换不会把任何信息压入堆栈中,处理器的状态信息都被保存在内存中称为任务状态段(Task state segment)的数据结构中。

4.7.1 任务的结构和状态

        一个任务由两部分构成:任务执行空间和TSS。任务执行空间包括代码段、堆栈段和一个或多个数据段。TSS指定了构成任务执行空间的各个段,并且为任务状态信息提供存储空间。

        一个任务的使用由指向其TSS的段选择符来指定。当一个任务被加载进处理器中执行时,那么该任务的段选择符、基地址、段限长以及TSS段描述符属性就会被加载进任务寄存器TR(Task Register)中。如果使用了分页机制,那么任务使用的页目录基地址就会被加载进控制寄存器CR3中。

        当前执行任务的状态由处理器的如下内容组成:所有通用寄存器和段寄存器信息;标记寄存器EFLAGS、程序指针EIP、控制寄存器CR3、任务寄存器和LDTR寄存器;段寄存器指定的任务当前执行空间;I/O映射位图基地址和I/O位图信息(在TSS中);特权级0、1和2的堆栈指针(在TSS中);连接至前一个任务的链指针(在TSS中)。

4.7.2 任务的执行

        调度任务执行的方法都会使用一个指向任务门或任务TSS段的选择符来确定一个任务。当调度一个任务执行时,当前正在运行任务和调度任务之间会自动地发生任务切换操作。在任务切换期间,当前运行任务的执行环境(称为任务的状态或上下文)会被保存到它的TSS中并且暂停该任务的执行。此后新调度任务的上下文会被加载进处理器中,并且从加载的EIP指向的指令开始执行新任务。

4.7.3 任务管理数据结构

        处理器定义了以下支持多任务的寄存器和数据结构:任务状态段TSS、TSS描述符、任务寄存器TR、任务门描述符和标志寄存器EFLAGS中的NT标志。

        1. 任务状态段

        用于恢复一个任务执行的处理器状态信息被保存在称为任务状态段(Task State Segment,TSS)的段中。

        2. TSS描述符

        与其他段一样,任务状态段TSS也是使用段描述符来定义。TSS描述符只能存放在GDT中。

        使用调用或跳转指令,任何可以访问TSS描述符的程序都能够造成任务切换。

        3. 任务寄存器

        任务寄存器(Task Register, TR)中存放着16位的段选择符以及当前任务TSS段的整个描述符(不可见部分)。

       指令LTR和STR分别用于加载和保存任务寄存器的可见部分,即TSS段的选择符。

        4. 任务门描述符

        任务门描述符(Task Gate Descriptor)提供一个任务间接、受保护的引用。任务门描述符可以被存放在GDT、LDT或IDT表中。

4.7.4 任务切换

        处理器可使用以下4种方式执行任务切换操作:

        (1)当前任务对GDT中的TSS描述符执行JMP或CALL指令。

        (2)当前任务对GDT或LDT中的任务门描述符执行JMP或CALL指令。

        (3)中断或异常向量指向IDT表中的任务门描述符。

        (4)当EFLAGS中的NT标志置位时当前任务执行IRET指令。

4.7.5 任务链

        TSS的前一任务链接(Backlink)字段以及EFLAGS中的NT标志用于返回到前一个任务操作中。NT标志指出了当前执行的任务是否嵌套在另一个任务中执行,并且当前任务的前一个任务链接字段中存放着嵌套层中更高层任务的TSS选择符(若有的话)。

4.7.6 任务地址空间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐