switch_to及ret_from_sys_call控制任务的切换与返回

本文详细介绍了Linux内核中如何通过`switch_to`及`ret_from_sys_call`控制任务的切换与返回。当进程执行系统调用时,通过 `_system_call` 进行中断处理,完成调用后可能触发进程调度。`reschedule` 会保存当前进程状态并执行 `schedule` 函数选择下一个进程。在 `switch_to` 中,CPU会保存当前进程的内核态信息并加载新进程的状态,从而完成上下文切换。当控制权再次回到原进程时,通过`ret_from_sys_call`恢复现场并返回用户态,继续执行后续指令。
摘要由CSDN通过智能技术生成

     当进程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时, 即将

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值