首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
深入学习LINUX内核之五(图文讲解)
来源:http://www.unix5.com 作者:riechelr_hl 发布时间:2008-04-15  
4.7 任务管理

任务(Task)是处理器可以分配调度、执行和掛起的一个工作单元。它循
於执行程式、任务或进程、作业系统服务、中断或異常处理行程和內核代码?。

80X86提供了一种机制,这种机制可用来保存任务的状态、分派任务执行以及从一个任务切換到另一个任务。当工作在保护模式下,处理器所有执行都在任务中。即使是简单系统也必须起码定义一个任务。更为复杂的系统可以使用处理器的任务管理功能来支援多工应用。

80X86提供了多工的硬体支援。任务是一个正在执行的程式,或者是一个等待準备执行的程式。透过中断、異常、跳转或呼叫,我们可以执行一个任务。当这些控制转移形式之一和某个描述符号表中指定项的內容一起使用时,那麼这个描述符号就是一类导致新任务开始执行的描述符号。描述符号表中与任务相关的描述符号有两类:任务状态段描述符号和任务门。当执行权传给这任何一类描述符号时,都会造成任务切換。


任务切換很像程序呼叫,但任务切換会保存更多的处理器状态资讯。任务切換会把控制权完全转移到一个新的执行环境,即新任务的执行环境。这种转移操作要求保存处理器中几乎所有寄存器的当前內容,包括标志寄存器EFLAGS和所有段积存器。与行程不过,任务不可重入。任务切換不会把任何资讯压入堆栈中,处理器的状态资讯都被保存在记忆体中称为任务状态段(Task state segment)的资料结构中。


4.7.1 任务的结构和状态

一个任务由两部分构成:任务执行空间和任务状态段TSS(Task-state segment)。任务执行空间包括代码段、堆栈段和一个或多个资料段,见图4-33所示。如果作业系统使用了处理器的特权级保护机制,那麼任务执行空间就需要为每个特权级提供一个独立的堆栈空间。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 任务的执行

软件或处理器可以使用以下方法之一来调度执行一个任务:

▓ 使用CALL指令明确地呼叫一个任务;

▓ 使用JMP指令明确地跳转到一个任务 (Linux內核使用的方式) ;

▓ (由处理器) 隐含地呼叫一个中断控制码处理任务;

▓ 隐含地呼叫一个異常控制码处理任务;

所有这些排程调度任务执行的方法都会使用一个指向任务门或任务TS段的选择符号来确定一个任务。当使用CALL或JMP指令调度一个任务时,指令中的选择符号既可以直接选择任务的TSS,也可以选择存放有TSS选择符号的任务门。当调度一个任务来处理一个中断或異常时,那麼IDT中该中断或异常表项必须是一个任务门,並且其中含有中断或異常处理任务的TSS选择符号。

当调度排程一个任务执行时,当前正在执行任务和调度任务之间会自动地发生任务切換操作。在任务切換期间,当前执行任务的执行环境 (称为任务的状态或上下文)会被保存到它的TSS中並且暂停该任务的执行。此后新调度任务啊下文会被载入进处理器中,並且从载入的EIP指向的指令处开始执行新任务。

如果当前执行任务(呼叫者) 呼叫了被调度的新任务(被呼叫者),那么呼叫者的TSS段选择符号会被保存在被呼叫者TSS中,从而提供了一个返回呼叫者的链结。对於所有80X86处理器,任务是不可递回呼叫的,即任务不能呼叫或跳转到自己。

中断或異常可以透过切換到一个任务来进行处理。在这种情況下,处理器不仅能夠执行任务切換来处理中断或異常,而且也会在中断或異常处理任务返回时自动地切換回被中断的任务中去。这种操作方式可以处理在中断任务执行时发生的中断。

作为任务切換操作的一部份,处理器也会切換到另一个LDT,从而允许每个任务对基於LDT的段具有不同逻辑到实体位址的映射。同时,页目錄寄存器CR3也会在切換时被重新载入,因此每个任务可以有自己的一套页表。这些保护措施能夠用来隔絕各个任务並且防止它们相互干扰。

使用处理器的任务管理功能来处理多工应用足任选的。我们也可以使用软件来实现多工,使得每个软体定义的任务在一个80X86体系结构的任务上下文中执行。
4.7.3任务管理资料结构

处理器定义了一下一些支援多工的寄存器和资料结构:

▓ 任务状态段TSS;

▓ TSS描述符号;

▓ 任务暂存器TR;

▓ 任务门描述符号;

▓ 标志寄存器EFLAGS中的NT标志。

使用这些资料结构,处理器可以从一个任务切换到另一个任务,同时保存原任务的的上下文,以允许任务重新执行。


任务状态段

用於恢复一个任务执行的处理器状态资讯被保存在一类称为任务状态段TSS(Task state segment) 的段中。图4-34给出了32位元CPU使用的TSS的格式。TSS段中各栏位可分成两大类:动态栏位和靜态栏位。







⑴ 动态栏位。当任务切换而被挂起时,处理器会更新动态栏位的内容。这些栏位包括:

● 通用寄存器栏位。用于保存EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI寄存器的内容。

● 段选择符号栏位。用于保存ES、CS、SS、DS、FS和GS段寄存器的内容。

● 堆栈寄存器EFLAGS栏位。在切换之间保存EFLAGS。

● 指令指标EIP栏位。在切换之前EIP寄存器内容。
共7页: 上一页 1 [2] [3] [4] [5] [6] [7] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
  相关文章
·深入学习LINUX内核之四(图文讲解
·深入学习LINUX内核之六(图文讲解
·深入学习LINUX内核之三(图文讲解
·深入学习LINUX内核之七(图文讲解
·深入学习LINUX内核之二(图文讲解
·深入学习Linux内核文档一(图文讲
·Linux系统内核漏洞分析
·如何在Linux内核中的实现SYN Coo
·简析Linux与FreeBSD的syscall
·Linux操作系统“警惕”内核汉化
·Linux操作系统核心的汉字显示机
·如何利用异常表处理Linux内核态

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!