系统一般执行过程
- 正运行在用户态的X进程
- X进程发生中断(可能产生了系统调用、异常等)
- 保存CS:EIP、SS:ESP、eflags寄存器到X进程内核堆栈
- 加载CS:EIP到中断处理函数入口,加载SS:ESP到X进程内核堆栈
- 以上两点是int 0x80系统指令完成的
- 中断处理函数中一段汇编指令SAVE_ALL,将X进程用户态硬件上下文信息全部保存起来到内核堆栈,此时进程X运行在内核态
- 当系统调用函数执行完成,在中断返回之前中断处理函数会固定调用schedule()函数,使用switch_to()函数进行进程上下文的切换,此时CS:EIP寄存器切换至Y进程的指令地址(next->thread.ip,即:1f,在之前的文章进程切换中有说明)
- 切换至Y进程的内核态中,由于此前进程Y被调度出去,保持了1f地址到(prev->thread.ip),那么Y进程从这里开始执行,恢复内核堆栈信息,其中内核堆栈保存了函数调用过程,继续执行schedule()函数调用后的代码,RESOTRE_ALL() 和 iret(对于上面第2、3点),iret后将Y的CS:EIP、SS:ESP等硬件上下文都恢复到用户态之后继续执行用户态代码段代码。
进程中断 和 进程上下文切换区别
进程中断
进程中断是某一个进程的CPU硬件上下文的切换,将CS:EIP、SS:ESP等寄存器切换到内核函数地址和内核堆栈地址等,从此至终(从用户态->内核态->用户态,若没有发生进程调度)都是同一个进程在运行,即PCB进程控制块在内核中等同一个,只是部分CPU硬件上下文有变化
进程上下文切换
进程上下文切换是两个进程之间等切换,它包括内存寄存器等切换(CR3),两个进程等内核堆栈、EIP寄存器等切换等等。内核进程控制块由prev切换到next(由于内核ESP寄存器切换,get_current_thread 函数返回的就是next进程的进程控制块信息)
网友评论