进程上下文切换:
硬件上下文:CPU核心的寄存器数据, 在Linux中硬件上下文一部分放在TSS段(内存中的一段空间),一部分放在内核态堆栈中
thread:因为进程不把硬件上下文保存在TSS中,而是保存在这个类型为thread_struct的thread字段中,这里包含大部分CPU寄存器的值,
但不包括一些通用寄存器,他们的值保留在内核堆栈中
Linux调度程序调度进程的过程:首先如果调度程序决定要把CPU交个某个进程,那么开始进行进程切换:
1.吧进程描述符thread字段的值装入几个寄存器,特别是吧thread.esp(即进程内核态堆栈的地址)装入esp寄存器,
2.调用schedule_tail()函数(它一次调用finish_task_switch来完成进程切换)
3.用存放在栈中的值再装载所有寄存器,并强迫CPU返回到用户态,这是后CPU开始执行该进程
CPU响应中断也会吧当前进程挂起,然后执行中断响应,这里和进程的上下文切换过程是差不多了,但是有些不一样:
1.中断或异常处理程序执行的代码不是一个进程,更确切的说,他是一个内核控制路径,代表中断发生时正在运行的进程执行
2.作为一个内核控制路径,中断处理程序比一个进程要轻,(中断的上下文很少,建立或终止中断处理需要的时间很少)