Chinaunix首页 | 论坛 | 博客
  • 博客访问: 121117
  • 博文数量: 31
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 361
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-11 15:38
文章分类

全部博文(31)

文章存档

2008年(31)

我的朋友

分类: LINUX

2008-04-07 18:58:47

 

今天仍在进程的总体概念上学习,又学到了一些关于任务切换的东西,下面作一下总结:

一、I386体系cpu任务切换机制

   I386体系从硬件上支持任务间的切换。为此目的,增设了一种新段:任务状态段(TSS),首先它和数据段、代码段一样也是一种段,其次它记录了任务的状态信息,也就是与程序运行相关的各个寄存器的值,任务切换的时候,cpu会自动将原寄存器的内容写出到当前任务的tss中,同时将新任务的tss的内容填到寄存器中,cpu就有了新任务运行的各个环境,这样就实现了任务的切换。那么cpu是怎么找到tss的呢?是通过TR寄存器,它的内容是一个选择符,指向GDT中对应进程的TSS描述符,TSS描述符又指向进程控制块中的任务状态段TSS

二、进程切换的时机

处理器在可以使用下面四种方式之一进行任务的切换。

1)当前任务对GDT或者LDT中的TSS描述符执行JMP或者CALL指令操作

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

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

4)当EFLAGS中的NT1时,当前任务执行IRET指令。

三、LINUX任务切换机制

   任务状态段在LINUX中存储在进程控制块task_struct中:tss,具体内容见sched.h

   具体的切换操作是通过switch_to这个宏实现的,它利用长跳指令,当长跳指令的操作数是TSS描述符的时候,就会引起CPU的任务的切换,此时,cpu将所有寄存器的状态保存到当前任务寄存器TR所间接指向的TSS段(当前任务的任务状态段)中,然后利用长跳指令的操作数(TSS描述符)找到新任务的TSS段,并将其中的内容填写到各个寄存器中,最后,将新任务的TSS选择符更新到TR中。这样系统就正式开始运行新切换的任务了。

   上面是0.11核心中任务切换的实现机制,在2.4核以后,系统中只有一个TSSTR在初始化设置后就不改变了,CPU的寄存器信息不再依靠TSS保存了,各个进程的运行环境保存在各自的系统空间堆栈中。 

 

阅读(2943) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~