- 论坛徽章:
- 0
|
3549: if (likely(prev != next)) {
next->timestamp = next->last_ran = now;
rq->nr_switches++;
rq->curr = next;
++*switch_count;
prepare_task_switch(rq, next);
prev = context_switch(rq, prev, next); barrier();
/*
* this_rq must be evaluated again because prev may have moved
* CPUs since it called schedule(), thus the 'rq' on its stack
* frame will be invalid.
*/
finish_task_switch(this_rq(), prev);
} else
spin_unlock_irq(&rq->lock);
prev = current;
if (unlikely(reacquire_kernel_lock(prev) < 0))
goto need_resched_nonpreemptible;
preempt_enable_no_resched();
if (unlikely(test_thread_flag(TIF_NEED_RESCHED)))
goto need_resched;
}
以上代码为内核schedule()中的源代码 从3549行开始。
我的疑惑为红色代码中的context_switch 函数.
我的理解为这个函数负责进程上下文的切换。
调用这个函数之后应该就不会立即返回。因为进程的上下文已经变化了。也就是说barrier();暂时得不到执行 除非又换回
context_switch以前的上下文。这样才会执行。。。
照这个思路下去 只有shedule()才能进行上下文的切换。这样的话 内核不就是在递归的调用schedule()吗?
思路是不是有点不对? 往大家指正~
[ 本帖最后由 ring8595 于 2008-12-11 20:39 编辑 ] |
|