进程切换问题

基础知识:

一个任务的所有信息都存放在任务状态段中,任务状态段与相应的段描述符相关。任务段描述符只能存放在GDT中,TR寄存器16位可见部分存放TSS段选择符。

在任务切换过程中,首先,处理器中各寄存器的当前值被自动保存到TR所指定的TSS中;然后,下一任务的TSS的选择子被装入TR;最后,从TR所指定的TSS中取出各寄存器的值送到处理器的各寄存器中。由此可见,通过在TSS中保存任务现场各寄存器状态的完整映象,实现任务的切换。

 

System_call.s中:

reschedule:

       pushl $ret_from_sys_call

       jmp _schedule

schedule中并没有执行IRET,那么程序是怎么在完成

schedule的调用后,跳到ret_from_sys_call中执行的?

  

是不是在执行switch_to(next)中的"ljmp %0/n/t" 切换到新的进程,以后再切换到当前进程后,则继续执行switch_to(next)中以下的语句。执行完switch_to后返回到ret_from_sys_call,然后执行IRET返回进程0的用户态,for(;;) pause()

 

 

拿由进程0的用户态切换到进程1为例:进程0执行系统调用fork(),System_call.s中调用完sys_fork,此时执行

reschedule:

       pushl $ret_from_sys_call

       jmp _schedule

schedule中执行switch_to(next)"ljmp %0/n/t" 切换到新的进程1的用户态。(因为进程1用户态程序、数据、堆栈,tast_struct中的TSS结构。都是拷贝进程0的,而TSS中的CSIP要执行的则是判断fork()的返回值),因为在进程1fork()的返回值为0,所以执行init();执行完后,通过TSS中的连接字段回到进程中switch_to(next)"ljmp %0/n/t"以下的语句。执行完switch_to后返回到ret_from_sys_call。然后执行IRET返回进程0的用户态,在进程1fork()的返回值为1,执行for(;;) pause()

 

补充:schedule()

schedule()进程检测唤醒号的任务针对务, alarm。如果任 alarm  间已过期(alarm<jiffies), 则在中设 SIGALRM 然后 alarm jiffies 是系统开始10ms/ 滴答)。 sched.h  义。中除有其于 可中TASK_INTERRUPTIBLE),则任务TASK_RUNNING)。

随后理部进程度机要 执行检查务,剩余 counter选取,并 switch_to()切换绪态, 表示片都根据先权 priority重置每行时 间 counter新执行循行时

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值