中断的上下文切换和任务调度的上下文切换

来源:互联网 发布:share.js用法 编辑:程序博客网 时间:2024/06/05 14:40
 linux内核分析
中断是在同一个进程的上下文中(在中断函数中可能产生进程调度),而进程上下文切换时在两个进程之间进行切换。中断 用户态陷入内核态。进程调度是在内核态完成的。

中断的执行过程

1.内核把当前eip esp等压到内核堆栈里面去 然后把eip的内容放到中断函数开始处产生中断。例如: int指令会在堆栈(内核堆栈)上保存一些寄存器的值(用户态栈顶地址,当时的状态字,当时的eip的值)。然后把 cs:eip(中断服务程序入口) ss:esp(指向内核的堆栈)加载到cpu寄存器。

2.保护现场save all:进入中断的首要任务是保护现场 push es ds eax ebp edi esi edx ecx(因为已经切换为内核堆栈 所以信息保存在了内核堆栈)
中断服务(过程中可能执行进程调度)。如果发生了任务调度 (save all)这些信息会暂时保存在系统里面(内核堆栈) 切换回来之后再 restore all
3. 恢复现场restore all

进程调度的过程

进程调度是在内核态中完成
1 根据调度算法选出下一个进程 next= pick_next_task();
2 进程上下文切换
调用context_switch();
context_switch(rq,prev,next){
prepare_task_switch(rq,prev,next);
...
switch_to();////切换堆栈和寄存器的状态切换
sp(因为此时在中断内部(内核态) 所以sp内核堆栈的栈顶)
save flags push ebp 把当前的栈顶保存在 prev->thread.sp ,把next的栈顶加载到esp
接下来的操作就是在next进程的内核堆栈里面了。
save eip 恢复next进程的eip(对于新创建的进程是ret-from_fork)
}


阅读全文
0 0