`
memorymyann
  • 浏览: 266431 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于TSS

阅读更多

在intelx86中,任务是设计者对进程的代名词(他们管进程叫任务)。这是从CPU角度考虑进程的,和从操作系统看进程,2者是有差距(比如在操作系统中每个进程都有自己的户口,既进程控制块,但在任务里面没有)。

设计者为了使CPU支持任务间的切换(实际上就是进程间的切换),就在i386系统中新增了一个段:任务状态段TSS,相当于代码段,数据段。但它是一个104字节的数据结构,记载了以下信息用于支持任务间的切换:
1.切换前,各个通用寄存器的内容(AX,BX,CX等)。
2.切换前,段寄存器的内容(CS,DS等)。
3.切换前,EFLAGS寄存器内容。
4.切换前,指令寄存器EIP内容。
5.指向前一个任务的TSS段选择码。
6.该任务的LDT选择码,指向当前任务的LDT。
7.控制寄存器CR3内容,页面目录。
8.3个堆栈指针,分别用于0,1,2这3个级别的堆栈。
9.用于程序跟踪标志T,主要用于DEBUG。
10.I/O权限位图。

CPU中新增任务寄存器TR,指向当前任务的TSS。中断的各种门中,有一个任务门用于任务切换。任务门中有一个TSS选择码,当CPU中断后,TSS选择码的内容载入后,硬件就会自动将CPU中断前内容载入到TSS中,从而形成一次任务的切换。

这种设计非常周到,i386属于CISC(复杂指令CPU)符合它的设计宗旨,但可以看出任务切换,进程切换是属于高级语言的内容,其过程非常复杂,CPU给我们一条指令让我们实现了进程间的切换,自己做了大部分工作(这种工作为了保证其健壮性,不得不做很多我们看起来很多余的工作,但为了保证系统的正常运行,这么做是必须的,提供共性的服务最大的缺点就是要考虑所有可能发生的状况,从而避免出错)。这条任务切换指令(jmp和call指令),执行的过程高达300个CPU时钟周期。因此,在linux操作系统中,同样像应付段式映射一样,绕过CPU,没有使用i386提供的任务切换.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics