【轉】嵌入式Linux檔案系統啟動指令碼及分析

來源:互聯網
上載者:User

標籤:

原文網址: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檔案系統啟動指令碼及分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.