Linux學習 根檔案系統

2021-09-27 11:09:54 字數 3065 閱讀 3239

通過之前的內容知道了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的縮寫,該目錄下的檔案都是和裝置有關的,此目錄下的檔案都是裝置檔...