D:\linux4.12\linux-4.12.1\arch
这个目录下放的是各种CPU上电启动的代码,没有具体研究看不大懂
D:\linux4.12\linux-4.12.1\init\main.c
这里是初始化的C语言代码,这里的初始化和体系结构无关,起始函数start_kernel(void)
asmlinkage __visible void __init start_kernel(void)
{
...
rest_init();
}
rest_init()是最后一个函数,前面是初始化内核的各种子系统,没有具体研究。
这里看一下rest_init()这个函数
static noinline void __ref 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);
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);
}
kernel_thread(kernel_init, NULL, CLONE_FS);
创建PID为1的进程,即init进程
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
创建PID为2的进程,负责初始化内核的其他线程
init是用户空间第一个进程,负责启动用户程序,用户常用的init程序有sysvinit、busybox init、upstart、systemd、procd。