在一中我们说到了多任务即不同进程都有自己的独立的代码段,数据段,堆栈段。看似利用这个原理能将多任务隔离,但是他们各个段的起始地址又都是0,这就是很无语了,不过没关系,分页的时候会接着讲。这篇文章说一下多任务的切换。
x86体系从硬件上支持任务间的切换,也就说实际上linux同一时间只是在运行一个任务,但是由于他可以在很短的时间在不同的任务间来回切换执行,我们感觉上他是多个任务一起执行的。既然要在任务间来回切换那么势必就要记录每一个进程被切换时的状态,以便切换回来的时候恢复。所有每一个进程都有属于自己的一个记录进程状态的段TSS(taskstate segment)。
既然有了段那么就有段起始地址和段大小等的问题,好吧,自然而然的段描述符(tssd)该出场了,既然段描述符都出来了那么总需要有个放段描述符的地方吧,大名鼎鼎的GDT就出来了。这就回到了之前博文提到的原理了。但是wait这里的tss只是给出了少数的任务状态,还有一大部分任务状态被记录到了tssd(任务状态描述符)里面,tssd中有一个类型为thread_struct的thread字段,专门存放这些信息。
这样硬件切换进程的时候只需要把现在进程的状态保持,再把切换到的进程状态拿回来就可以了。状态你可以理解为各个寄存器里面的值。
参考:
http://oss.org.cn/kernel-book/ch05/5.4.1.htm
http://guojing.me/linux-kernel-architecture/posts/process-switch/
时间: 2024-12-11 14:02:25