为什么初始化进程不能动态创建?



根据我的理解,初始化进程是在Linux中启动的第一个用户空间进程,是在arch/ia64/kernel/init_task.c中创建静态的。

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

实际上,类型为 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);

因此,平板分配器可能在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;

最新更新