通過之前的內容知道了u-boot是用來啟動核心的,而核心會掛接根檔案系統用以啟動應用程式,那核心是怎樣啟動第乙個應用程式的?
①在init_post( )中,開啟dev/console裝置,而後呼叫sys_dup(0)、sys_dup(0),即執行複製操作
dev/console:printf( )、scanf( ) 都是從該檔案裡輸出或輸入的,dev/console就是終端,可能是串列埠、lcd、鍵盤等
②init_post( )中,通過run_init_process( )啟動相關的應用程式,可以在命令列裡的引數指定或者是init_post( )裡其他的。
常用的ls、cd、cp其實都是呼叫了busybox這個程式。
在busybox的原始碼裡面有乙個init( )程式,init( )會先讀取乙個配置檔案->解析配置檔案->根據配置檔案執行使用者的應用程式。
配置檔案裡會指定應用程式並說明什麼時候執行。
①執行時busybox會呼叫init_main( ),init_main( )會呼叫parse_inittab( ),
parse_inittab( )執行file = fopen(inittab, "r"); file被定義為檔案指標,該操作會開啟配置檔案/etc/inittab,之後解析配置檔案
注:inittab的格式是: : :
id => /dev/id,用作終端:stdin,stdout,stderr:printf、scanf、err
runlevels:忽略
action:指示何時執行
process:應用程式或指令碼
有配置檔案時會執行:
while (fgets(buf, init_buffs_size, file) != null) else
/* separate the runlevels from the action */
action = strchr(runlev, ':');
if (action == null || *(action + 1) == '\0') else
/* separate the action from the command */
command = strchr(action, ':');
if (command == null || *(command + 1) == '\0') else
/* ok, now process it */
for (a = actions; a->name != 0; a++)
new_init_action(a->action, command, id);
break;
} }if (a->name == 0)
}
②如果沒有配置檔案,parse_inittab( )有一套預設的配置項:
if (file == null)
new_init_action(askfirst, bb_default_login_shell, vc_2);將其中的巨集定義展開為
new_init_action(askfirst, "-/bin/sh", "/dev/tty2");
宣告:static void new_init_action(int action, const char *command, const char *cons)
該函式執行時會定義乙個結構體:
struct init_action ;
因此new_init_action執行時會:
①建立乙個init_action結構體變數,填充配置
②放入init_action_list鍊錶
③(節選)
/* first run the sysinit command */
run_actions(sysinit);
/* next run anything that wants to block */
run_actions(wait);
/* next run anything to be run only once */
run_actions(once);
while (1)
}
以run_actions(sysinit);run_actions(wait);為例:
在該函式裡:a是指向init_action_list鍊錶的指標
會執行函式waitfor(a, 0):執行應用程式,等待執行完畢,裡面會執行函式run(a):建立子程序(process裡指定的應用程式)
會執行函式delete_init_action(a):在init_action_list煉表裡刪除
以run_actions(once)為例:
會執行函式run(a);
會執行函式delete_init_action(a);
init程序不會等待其執行完畢
總結:最小根檔案系統需要:
①/dev/console、/dev/null
②init應用程式,**於busybox
③要有配置檔案,在/etc/inittab
④配置檔案指定的應用程式
⑤要有包含c標準庫
Linux根檔案系統
root 檔案系統是檔案系統的頂級目錄。它必須包含在掛載其它檔案系統前需要用來啟動 linux 系統的全部檔案。它必須包含需要用來啟動剩餘檔案系統的全部可執行檔案和庫。檔案系統啟動以後,所有其他檔案系統作為 root 檔案系統的子目錄掛載到標準的 預定義好的掛載點上。bin 該目錄存放所有使用者可以...
linux檔案系統與根檔案系統
檔案系統 與 根檔案系統 要不我們就統一簡稱為fs和rfs 檔案系統 file system fs 根檔案系統 root file system rfs。首先你考慮一點描述語句 根檔案系統也是一種 檔案系統 可以認為是一種 特殊的 檔案系統 為什麼是叫 特殊的 呢?是因為這種 根 檔案系統 承載著某...
Linux學習筆記 根檔案系統簡介
以ubuntu為例 根檔案系統的目錄名字為 乙個斜槓 輸入cd 進入根檔案系統 bin檔案就是可執行檔案。所以此目錄下存放著系統需要的可執行檔案,一般都是些命令,此目錄下的命令所有的客戶都可以使用,列舉了其中一部分 dev是device的縮寫,該目錄下的檔案都是和裝置有關的,此目錄下的檔案都是裝置檔...