- 论坛徽章:
- 0
|
内核在启动的时候,最先由0进程对硬件等相关内容进行初始化。
直到执行rest_init函数的时候,它才开始创建出1进程。
下面是这个函数的原型,我想问题的是:
当调用kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
的时候,0和1这个进程是怎么共存的?按我的理解,在多CPU平台上,前面的初始化都是不可抢占的,我理解的不可抢占的意思就是由一个CPU
来完成相应的初始化过程?那么其他的CPU状态是怎么样的?工作嘛?
这个时候,0和1这两个进程是放在同一个CPU里面的进程队列嘛?不可抢占是不是意味着不可调度?
如果0和1位于同一个CPU上的进程队列里面,那么这两个线程要相互执行,那么当0线程执行到
schedule_preempt_disabled();的时候是不是说明现在1进程不被调度了?
如果1不被调度了,紧接着0进入cpu_idle的状态,那么谁去设置need_resched 标志让0进程调度出去,让别的进程执行?也就是现在的1进程
执行?
当然我是在不太懂的前提下提的这些问题,可能问题本身就带着问题。希望大牛帮忙回答我的这些问题。
static noinline void __init_refok rest_init(void)
{
int pid;
rcu_scheduler_starting();
/*
* We need to spawn init first so that it obtains pid 1, however
* the init task will end up wanting to create kthreads, which, if
* we schedule it before we create kthreadd, will OOPS.
*/
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
numa_default_policy();
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
rcu_read_lock();
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
rcu_read_unlock();
complete(&kthreadd_done);
/*
* The boot idle thread must execute schedule()
* at least once to get things moving:
*/
init_idle_bootup_task(current);
schedule_preempt_disabled();
/* Call into cpu_idle with preempt disabled */
cpu_startup_entry(CPUHP_ONLINE);
}
|
|