为什么init进程不能动态创建?

why init process can't create dynamically?

根据我的理解,init 进程是在 Linux 中开始的第一个用户-space 进程,它是在 arch/ia64/kernel/init_task.c 中静态创建的。

为什么我们不能动态创建这个init进程?一旦内核启动,slab 分配器就可用,所以我们可以从 slab 分配器获取 task_struct 并创建 init 进程?

实际上,类型为 struct task_struct *init_task 是在 arch/*/kernel/init_task.c 文件中定义的。此结构在 start_kernel 早期使用:http://lxr.free-electrons.com/source/init/main.c?v=3.10#L471

471 asmlinkage void __init start_kernel(void)
472 {

481         smp_setup_processor_id();

489         cgroup_init_early();

498         boot_cpu_init();
499         page_address_init();
500         pr_notice("%s", linux_banner);
501         setup_arch(&command_line);
502         mm_init_owner(&init_mm, &init_task);

因此,slab 分配器可能在 init 启动时可用,但 init 的 task_struct 更早使用,在 start_kernel 和其他地方 (http://lxr.free-electrons.com/ident?v=3.10&i=init_task) 例如静态地 在其他 CPU 上初始化 current_task 指针。

http://lxr.free-electrons.com/source/arch/x86/kernel/cpu/common.c?v=3.10#L1080

1084 DEFINE_PER_CPU(struct task_struct *, current_task) ____cacheline_aligned =
1085         &init_task;