歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 嵌入式Linux文件系統啟動腳本及分析

嵌入式Linux文件系統啟動腳本及分析

日期:2017/2/28 16:19:24   编辑:Linux教程

在內核初始化完成後,嵌入式linux 文件系統的啟動過程主要包含以下幾個步驟:

1. 執行/sbin/init 文件

2. 執行/etc/inittab 文件

3. 執行/etc/init.d/rcS 文件

4. 執行掛載文件系統腳本

5. 執行內核模塊腳本

6. 執行網絡初始化腳本

7. 執行應用程序啟動等腳本,如qtopia 的啟動

系統啟動流程圖:

1. 內核啟動init

內核啟動的最後一步就是啟動init 進程,init 進程是由內核啟動的第一個(也是唯一一個和)用戶進程(進程ID 為1 ),它根據配置文件決定啟動哪些程序,比如某些腳本, 啟動shell ,運行用戶指定的程序等,,那麼init 進程又是怎麼啟動的呢---是由內核調用/sbin/init 文件而啟動的,那有人就有人想知道內核是如何找到需要執行的init 文件呢。下面看一下內核代碼中init/main.c ,如下所示:

static int noinline init_post(void)

{

free_initmem(); /* 釋放初始化內存*/

unlock_kernel();

mark_rodate_ro();

system_state=SYSTEM_RUNNING;

numa_default_policy();

/* 打開控制設備hanle=0=>stdin*/

if(sys_open((const char __user*) “/dev/console”, O_RDWR,0)<0)

printk(KERN_WARNING “Waring :unable to open an initial console.\n”);

/* 復制控制台設備到handle 1,2=>stout,stderr*/

(void)sys_dup(0);

(void)sys_dup(0);

/* 嘗試執行ramdisk_execute_command 指定的程序*/

if(ramdisk_execute_command) {

run_init_process(ramdisk_execute_command);

printk(KERN_WARNING “Failed to execute %s\n”,ramdisk_execute_command);

}

/* 嘗試執行execute_command 指定的程序*/

if(execute_command) {

run_init_process(execute_command);

printk(KERN_WARNING “Failed to execute %s\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 . Try passing init=option to kernel.”);

內核啟動init 進程的過程如下:

先打開控制台設備/dev/console ,並復制了兩個handle, 這樣stdout,stdin,stderr 都指向/dev/console, 這樣就打開了標准設備輸入,輸出,標准錯誤設備,然後執行幾個外部程序。這幾個程序中任何一個加載成功就進入了用戶態,內核啟動就宣告結束。

Copyright © Linux教程網 All Rights Reserved