进程----------进程切换

       内核挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。

硬件上下文:

       进程恢复执行前必须装入寄存器的一组数据称为硬件上下文,它包含进程执行时需要的所有信息。在linux中,进程硬件上下文的一部分存放在TSS段,剩余部分存放在内核态堆栈。早期的linux利用x86的硬件支持,采用 far jmp指令跳到待执行进程TSS描述符的选择符(far jmp既修改cs寄存器,又修改eip寄存器),现在自从linux2.6以后就使用软件执行进程切换,采用一组mov指令逐步执行切换,这样可以很好的控制所装入数据的合法性,尤其是使检查ds和es段寄存器的值成为可能,防止这些值被用户恶意伪造。进程切换只发生在内核态。


任务状态段:

       任务状态段(Task State Segment,TSS),每一个正在运行的CPU都会维持一个TSS:当一个CPU从用户态切换到内核态,它就从TSS中选取内核态堆栈的地址;用户态进程试图通过in或者out指令访问一个I/O端口时,CPU需要访问存放在TSS中的I/O许可权位图(Permission Bitmap)以检查进程是否有访问端口的权力。每次进程切换,内核都要更新TSS的某些字段以便相应的CPU控制单元都可以安全地检索它需要的信息。也即TSS反映了CPU上的当前进程的特权级,但不必为没有在运行的进程保留TSS。每个TSS都有8字节的任务状态段描述符(TSSD),它包括指向TSS起始地址的32位Base字段,20位Limit段,TSSD的S标志位清0则表示该段为系统段。

       由linux创建的TSSD存放在全局描述符表GDT中,GDT的基地址存放在CPU的gdtr寄存器中,每个CPU的tr寄存器包含相应TSS的TSSD选择符,也包含了两个隐藏的非编程字段:TSSD的Base字段和Limit字段。这样CPU就可以直接对TSS寻址而不用从GDT中检索TSS的地址。

       每个进程描述符包含一额thread字段,每次进程切换时,内核就把进程的硬件上下文保存在这个结构中。这个thread字段设计大部分CPU寄存器,但是不包括eax、ebx等通用寄存器,他们的值保存在内核堆栈中。


执行进程切换:

       1.切换全局目录以安装一个新的地址空间;

       2.切换内核态堆栈和硬件上下文

       在任何进程且黄中,涉及到三个进程。上面的第二步由switch_to宏执行,它有三个参数prev,next,last。其中last是输出参数,它



------------待续







你可能感兴趣的:(进程----------进程切换)