標籤:
原文網址:http://www.linuxidc.com/Linux/2011-03/33728.htm
在核心初始化完成後,嵌入式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, 這樣就開啟了標準裝置輸入,輸出,標準錯誤裝置,然後執行幾個外部程式。這幾個程式中任何一個載入成功就進入了使用者態,核心啟動就宣告結束。
2. 執行/etc/inittab 檔案
當init 啟動成功後,需要做的就是分析/etc/inittab 檔案並執行它。其內容如下:
# /etc/inittab
::sysinit:/etc/init.d/rcS
# 啟動shell 以/dev/ttySAC0 作為控制台
ttySAC0::askfirst:-/bin/sh
# 按下ctrl+alt+del 之後執行的程式,不過在串口控制台中無法輸入ctrl+alt+del 按鍵組合
::ctrlaltdel:/sbin/reboot
# 重啟關機前執行的程式
::shutdown:/bin/umount -a -r
3. 執行/etc/init.d/rcS 檔案
這是一個指令檔,可以在裡面添加想自動啟動並執行命令。內容如下:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
# 網路設定指令碼
. /etc/init.d/network.sh
# load zlg_fs
insmod /bin/zlg_fs.ko
insmod /bin/zlg_ffs.ko
mknod /dev/zlg_fsa b 125 0
mknod /dev/zlg_fsa1 b 125 1
mknod /dev/zlg_fsa2 b 125 2
mount -t vfat /dev/zlg_fsa /usr
mount -a
4. 執行/etc/fstab( 掛載檔案系統指令碼)
在檔案 /etc/init.d/rcS 中執行 mount –a 時,就會按照檔案 /etc/fstab 內容掛載相應的檔案系統 .
#device mount-point type options dump fsck order
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
(1)device : 要掛接的裝置,如 /dev/hda2
mount-point: 掛接點
type: 檔案系統類型,如 pro,jffs2,nfs
options: 掛接參數,以逗號隔開
dump 和 fsck order :用來決定控制 dump,fsck 程式的行為。
5. 接著就會執行一些核心模組和網路俄配置指令碼,最後執行應用程式啟動等指令碼,如 qtopia 的啟動。
【轉】嵌入式Linux檔案系統啟動指令碼及分析