asmlinkagevoid__initstart_kernel(void){.......................................... rest_init();}oinlinevoid__init_refokrest_init(void) __releases(kernel_lock){ intpid; rcu_scheduler_starting(); /* *Weneedtospawninitfirstsothatitobtainspid1,however *theinittaskwillendupwantingtocreatekthreads,which,if *wescheduleitbeforewecreatekthreadd,willOOPS. */ kernel_thread(kernel_init,NULL,CLONE_FS|CLONE_SIGHAND); 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); unlock_kernel(); /* *Thebootidlethreadmustexecuteschedule() *atleastoncetogetthingsmoving: */ init_idle_bootup_task(current); preempt_enable_no_resched(); schedule(); preempt_disable(); /*Callintocpu_idlewithpreemptdisabled*/ cpu_idle();}staticint__initkernel_init(void*unused){ /* *Waituntilkthreaddisallset-up. */ pletion(&kthreadd_done); lock_kernel(); do_basic_setup();.................................................. init_post(); return0;}oinlineintinit_post(void) __releases(kernel_lock){ /*needtofinishallasync__initcodebeforefreeingthememory*/ async_synchronize_full(); free_initmem(); unlock_kernel(); mark_rodata_ro(); system_state=SYSTEM_RUNNING; numa_default_policy(); current->signal->flags|=SIGNAL_UNKILLABLE; if(mand){ run_init_process(mand); printk(KERN_WARNING"Failedtoexecute%s\n", mand); } /* *eeds. * *TheBourneshellcanbeusedinsteadofinitifweare *tryingtorecoverareallybrokenmachine. */ if(mand){ run_init_process(mand); printk(KERN_WARNING"Failedtoexecute%" "defaults...\n",mand); } run_init_process("/sbin/init"); run_init_process("/etc/init"); run_init_process("/bin/init"); run_init_process("/bin/sh"); panic("=optiontokernel." "SeeLinuxDocumentation/.");}staticvoidrun_init_process(char*init_filename){ argv_init[0]=init_filename; kernel_execve(init_filename,argv_init,envp_init);}system\core\init\(intargc,char
Init进程启动 来自淘豆网m.daumloan.com转载请标明出处.