Linux系统的一般执行过程
- 正在运行的用户态进程X切换到运行用户态进程Y的过程
- 正在运行的用户态进程X
- 发生中断——save & load : eip/esp/eflags to/from kernel stack,从而切换到内核,进而运行中断处理程序
- SAVE_ALL //保存现场
- 中断处理程序过程中或返回前调用了
schedule()
,其中switch_to
做了关键的进程上下文切换 - 标号1之后开始运行用户态进程Y(为什么是1:因为Y曾经也是prev_thread被切换出去过,当时保存$1:到eip)
- RESTORE_ALL //恢复现场
- iret - pop cs:eip/eflags from kernel stack
- 继续运行用户态进程Y
- 中断上下文切换和进程上下文切换
- 几种特殊的情况
内核线程
主动调用schedele(),没有中断上下文切换,只有进程上下文切换- 创建子进程的系统调用在子进程的
执行起点(此时next_ip就不是$1了,而是ret_fom_fork)
返回用户态。 - 加载一个新的可执行程序后返回到用户态的情况,如
execve