分类: 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中的NT为1时,当前任务执行IRET指令。
三、LINUX任务切换机制
任务状态段在LINUX中存储在进程控制块task_struct中:tss,具体内容见sched.h。
具体的切换操作是通过switch_to这个宏实现的,它利用长跳指令,当长跳指令的操作数是TSS描述符的时候,就会引起CPU的任务的切换,此时,cpu将所有寄存器的状态保存到当前任务寄存器TR所间接指向的TSS段(当前任务的任务状态段)中,然后利用长跳指令的操作数(TSS描述符)找到新任务的TSS段,并将其中的内容填写到各个寄存器中,最后,将新任务的TSS选择符更新到TR中。这样系统就正式开始运行新切换的任务了。
上面是0.11核心中任务切换的实现机制,在2.4核以后,系统中只有一个TSS,TR在初始化设置后就不改变了,CPU的寄存器信息不再依靠TSS保存了,各个进程的运行环境保存在各自的系统空间堆栈中。