1、每个进程通过时钟中断出发trap.c中的
if(proc && proc->state == RUNNING && tf->trapno == T_IRQ0+IRQ_TIMER)
yield();来强制把这个进程置为Runnable状态,yield的实现如下:
acquire(&ptable.lock); //DOC: yieldlock
proc->state = RUNNABLE;
sched();
release(&ptable.lock);
在sched中
swtch(&proc->context, cpu->scheduler); 实现从当前进程的kernel Stack 切换到 CPU中专门负责程序调度的 scheduler Stack,
(gdb) p /x *cpus[0]->scheduler
$7 = {edi = 0x0, esi = 0x80104ea4, ebx = 0x8, ebp = 0x8010c608,
eip = 0x80104ab2}
此时,我们在 sched设置断点
(gdb)b proc.c:314
(gdb)s 进入汇编代码
在swtch的汇编代码中,我们将当前进程的esp所指向的内存地址+8 作为新的上下文的esp,然后保存老寄存值,popl加载新的寄存器的值
swtch:
movl
时间: 2024-12-19 18:47:52