構建根檔案系統之啟動第乙個程式(韋大仙)

2022-06-21 06:54:09 字數 1637 閱讀 2390

u-boot的目的:啟動核心

核心的目的:啟動應用程式,而應用程式位於根檔案系統上面。因此,需要構建根檔案系統。

只需完成以上幾步,就可以在單板上搭建出乙個linux系統來。

問題:有那麼多應用程式,核心啟動後首相開啟哪乙個?

核心啟動的時候,掛接好根檔案系統之後,執行應用程式在init_post函式中。

static int noinline init_post(void)

if (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.");

}核心怎樣啟動第乙個應用程式?

(1)open('/dev/console")嘗試開啟/dev/console裝置檔案,如果成功,它就是init程序標準輸入裝置。

sys_dup(0);將檔案描述符0複製給檔案描述符1

sys_dup(0);將檔案描述符複製給檔案描述符2

從而,標準輸入、標準輸出、標準錯誤都對應乙個檔案(裝置)。

開啟標準輸入、標準輸出、標準錯誤裝置

linux中最先開啟的三個檔案分別稱為標準輸入(stdin)、標準輸出(stdout)、標準錯誤(stderr)。它們對應的檔案描述符分別為0、1、2.所謂標準輸入就是在程式中使用scanf()、fscanf(stdin,...),從哪個檔案(裝置)讀取檔案;標準輸出、標準錯誤都是輸出裝置,前者對應printf()、fprintf(stdout,...),後者對應fprintf(stderr,...)

/dev/console對應的東東就終端。

(2)如果ramdisk_execute_command變數指定了要執行的程式,啟動它。

ramdisk_execute_command的取值分為三種情況:

a.如果命令列引數中指定了「rdinit=...」,則ramdisk_execute_command等於這個引數指定的程式。

b.否則,如果/init程式存在,ramdisk_execute_command就等於/init

c.否則,ramdisk_execute_command為空

韋老師書中所用的命令沒有設定「rdinit=...」,根檔案系統中也沒有"/init"。所以ramdisk_execute_command為空。if下的那塊程式不會執行。

(3)如果定義了execute_command,那麼就會執行run_init_process(execute_command);從而啟動execute_command這個應用程式。否則向下執行。

如果命令列中指定了"init=...",則execute_command等於這個引數指定的程式,否則為空。同樣沒有指定。

(4)依次嘗試執行/sbin/init、/etc/init、/bin/init、/bin/sh

在根檔案系統中,/sbin/init是存在的,因此執行/sbin/init程式。所以init程序所用的程式就是/sbin/init。從此系統的控制權交給/sbin/init,不再返回init_post函式中。

根檔案系統如何啟動第乙個程式

核心掛接上跟檔案系統之後 啟動第乙個引用程式init 1 open 標準輸入輸出 標準錯誤 2 執行函式run init process execute command init程式 1 讀取配置檔案 2 解析配置檔案 3 根據這些配置檔案執行使用者程式 parse initab new init ...

用busybox構建乙個最小根檔案系統

p 用busybox 構建乙個最小根檔案系統 15年4月4月23月23日23日日15 11 30 一 乙個最小根檔案系統包括 1 dev console dev null 2 init busybox 3 etc inittab 4 配置檔案制定的程式 5 c庫 二 下面寫步驟 1 解壓配置 bus...

第乙個Acegi程式 設定檔案

首先請先至 acegi官方網站,下載acegi程式庫,在撰寫這份教學檔案之時,所使用的版本是1.0.3。表acegi相關類別之間的依賴關係,可以藉由ioc容器來協助建立,在這邊您可以使用 spring 的ioc容器功能,您可以在下載的acegi檔案中,找到acegi security sample ...