资源描述:
《Init进程启动》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Init进程启动asmlinkagevoid__initstart_kernel(void){..........................................rest_init();}staticnoinlinevoid__init_refokrest_init(void)__releases(kernel_lock){intpid;rcu_scheduler_starting();/**Weneedtospawninitfirstsothatitobtainspid1,howe
2、ver*theinittaskwillendupwantingtocreatekthreads,which,if*wescheduleitbeforewecreatekthreadd,willOOPS.*/kernel_thread(kernel_init,NULL,CLONE_FS
3、CLONE_SIGHAND);numa_default_policy();pid=kernel_thread(kthreadd,NULL,CLONE_FS
4、CLONE_FILES);rcu_read_lock();kt
5、hreadd_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();
6、preempt_disable();/*Callintocpu_idlewithpreemptdisabled*/cpu_idle();}staticint__initkernel_init(void*unused){/**Waituntilkthreaddisallset-up.*/wait_for_completion(&kthreadd_done);lock_kernel();do_basic_setup();..........................................
7、........init_post();return0;}staticnoinlineintinit_post(void)__releases(kernel_lock){/*needtofinishallasync__initcodebeforefreeingthememory*/async_synchronize_full();free_initmem();unlock_kernel();mark_rodata_ro();system_state=SYSTEM_RUNNING;numa_defau
8、lt_policy();current->signal->flags
9、=SIGNAL_UNKILLABLE;if(ramdisk_execute_command){run_init_process(ramdisk_execute_command);printk(KERN_WARNING"Failedtoexecute%s",ramdisk_execute_command);}/**Wetryeachoftheseuntilonesucceeds.**TheBourneshellcanbeused
10、insteadofinitifweare*tryingtorecoverareallybrokenmachine.*/if(execute_command){run_init_process(execute_command);printk(KERN_WARNING"Failedtoexecute%s.Attempting""defaults...",execute_command);}run_init_process("/sbin/init");run_init_process("/etc/in
11、it");run_init_process("/bin/init");run_init_process("/bin/sh");panic("Noinitfound.Trypassinginit=optiontokernel.""SeeLinuxDocumentation/init.txtforguidance.");}staticvoidrun_init_process(char*init_filename){argv_init[0]=init_filename;ke