当进程A在用户态下执行着,出现了系统调用(int 0x80),CPU转而执行_system_call(system_call.s L80)中断处理过程,
_system_call 保持了进程A在用户态时的现场信息,然后执行call _sys_call_table(, %eax, 4)指令,当执行完本指令时,进程
A请求的系统调用已经完成了,_system_call剩下的代码是该系统调用中断处理过程的退出阶段。
当执行到jne reschedule时,处于内核态的进程A希望主动放弃CPU,实现进程调度,reschedule代码如下:
reschedule:
pushl $ret_from_sys_call
jmp _schedule
先将ret_from_sys_call地址入栈,然后跳转到sched.c L104 函数schedule入口处执行该函数,当执行到switch_to(next)时,
如果此时next = B,意味着CPU的使用权将从进程A切换到进程B,当在switch_to(next)中执行完指令ljmp %0/n/t时,此时
CPU自动将进程A的内核态现场环境保存到A对应的tss中,例如将ss, esp保存为进程A内核态堆栈,
将cs保存为0x0008(内核代码段)将eip保存为switch_to(next)中指令cmpl %%ecx,_last_task_used_math/n/t的地址
(即当下一次CPU重新切换到进程A时, 即将