0号进程(idle进程)完成一系列初始化之后,就进入一个while循环
While(1)
{
….
static void do_idle(void)
{
….
schedule_idle();~~~~
….
}
}
void __sched schedule_idle(void)
{
do {
__schedule(false);
} while (need_resched());
}
接着会调用schedule_idle(),然后自愿调用__schedule(false),让调度器挑出
下一个任务去执行。
现在要做的一个实验很简单,就是注释掉do_idle()中的schedule_idle().
这样系统应该怎么都调用不到schedule() ,此时系统会stall了。实验结果果真如此,此时终端也不会有任何响应。如果打开内核选项:
RCU_STALL_COMMON = y
CONFIG_RCU_CPU_STALL_TIMEOUT = 10(手动设置10s)
系统会打印出如下信息:
INFO: rcu_sched detected stalls onCPUs/tasks:
RCU_GP_WAIT_FQS(3) ->state=0x0->cpu=0
因为就算不能调用schedule(),此时一直有时钟中断过来,系统利用中断来检测。
此时时钟中断在进行,就代表说scheduler_tick函数在正常工作。这个函数完成的功能就是调用本进