为什么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;
根据我的理解,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;