首页 > 其他 > 详细

xv6的设计trick(不断更新)

时间:2016-06-10 17:34:59      阅读:246      评论:0      收藏:0      [点我收藏+]

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 

xv6的设计trick(不断更新)

原文:http://www.cnblogs.com/yanchengwang/p/5573857.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!