內核啓動流程
![](http://static.javashuo.com/static/loading.gif)
第二階段
starte_kernel
:
|
rest_init
:
|
kernel_init
|
do_basic_setup();
// 加載驅動
|
do_initcalls();
|
for (fn
= __early_initcall_end; fn
< __initcall_end; fn
++)
do_one_initcall(
*fn);
|
ret.result
= fn();
// 執行全部的驅動入口函數
prepare_namespace();
// 掛載文件系統
init_post();
// 啓動第一用戶進程
|
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING
"Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
run_init_process(
"/sbin/init");
run_init_process(
"/etc/init");
run_init_process(
"/bin/init");
run_init_process(
"/bin/sh");
panic(
"No init found.
kthreadd
schedule();
run_init_process
|
kernel_execve(init_filename, argv_init, envp_init); // 執行另外一個代碼空間
// /linuxrc==> busybox==>
// 注意點: 最好在bootargs傳遞init=/linuxrc
@成鵬致遠linux
(blogs:http://lcw.cnblogs.com)函數
(email:wwwlllll@126.com)post
(qq:552158509)spa