根据我的理解,init进程是从Linux开始的第一个用户空间进程,在arch/ia64/kernel/init_task.c
中创建了staticall。
为什么我们也不能动态创建这个init进程?一旦内核启动,slab分配器就可用,所以我们可以从slab分配器获取task_struct并创建init进程?
答案 0 :(得分:1)
实际上,类型为init_task
的{{1}}在arch / * / kernel / init_task.c文件中定义。这个结构在start_kernel的早期使用:http://lxr.free-electrons.com/source/init/main.c?v=3.10#L471
struct task_struct *
因此,slab分配器可能在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的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
init