根檔案系統init程序分析

2021-06-20 23:45:29 字數 2653 閱讀 9351

u-boot:啟動核心

核心 :啟動應用程式

核心啟動的第乙個應用程式是/sbin/init,啟動的最終目的是啟動其他的應用程式。

init程式 (1)讀取配置檔案

(2)解析配置檔案

(3)執行應用程式(根據配置檔案)

配置檔案:(1)指定應用程式(2)什麼時候執行

busybody->init_main   (init程序本身就是busybox)

parse_inittab() 解析配置檔案

file = fopen(inittab, "r") 開啟配置檔案,#define inittab      "/etc/inittab",配置檔案一般都放在/etc目錄下

new_init_action   如果配置檔案不存在,則執行預設的配置項

new_init_action:(1)建立乙個init_action結構、填充

(2)把這個結構放入init_action_list鍊錶

run_actions(sysinit);

waitfor(a, 0);  執行應用程式,等待它執行完畢

run(a)   建立process子程序

waitpid(runpid, &status, 0);  等待它結束

delete_init_action(a);  在init_action_list煉表裡刪除

run_actions(wait);

waitfor(a, 0);  執行應用程式,等待它執行完畢

run(a)   建立process子程序

waitpid(runpid, &status, 0);  等待它結束

delete_init_action(a);  在init_action_list煉表裡刪除

run_actions(once);

run(a);

delete_init_action(a); 

while (1)              

run_actions(askfirst);

if (a->pid == 0)                          

/* wait for a child process to exit */

wpid = wait(null);  等待子程序退出 

while (wpid > 0)

inittab格式:

:::=> /dev/id(加乙個/dev字首),用作終端:stdin,stdout,stderr

可以完全忽略

指示何時執行

應用程式或指令碼             

static void new_init_action(int action, const char *command, const char *cons)

struct init_action ;

for (a = last = init_action_list; a; a = a->next)

last = a;

}如果沒有這個action則建立它:

new_action = xzalloc(sizeof(struct init_action));分配記憶體

if (last) else

strcpy(new_action->command, command);

new_action->action = action;

strcpy(new_action->terminal, cons);

new_init_action(askfirst, bb_default_login_shell, vc_2);

bb_default_login_shell    #define libbb_default_login_shell      "-/bin/sh"

vc_2       # define vc_2 "/dev/tty2"    

new_init_action(askfirst, "-/bin/sh", "/dev/tty2");  

如果配置檔案不存在,則執行預設的配置項

file = fopen(inittab, "r");

if (file == null)

inittab格式:

:::: valid actions include: sysinit, respawn, askfirst, wait, once,

#                                  restart, ctrlaltdel, and shutdown.

從預設的new_init_action反推出預設的配置檔案:

::ctrlaltdel:reboot

::shutdown:umount -a -r

::restart:init

::askfirst:-/bin/sh

tty2::askfirst:-/bin/sh

tty3::askfirst:-/bin/sh

tty4::askfirst:-/bin/sh

::sysinit:/etc/init.d/rcs

最小根檔案系統:

(1)/dev/console  /dev/null

(2)/init=>busybox  init本身就是busybox

(3)/etc/inittab  配置檔案

(4)配置檔案指定的應用程式

(5)庫

Linux掛在根檔案系統後init不能執行

當製作好根檔案系統後,linux啟動正常掛在根目錄,但是init程式不能執行,uboot中已經指定了init linuxrc,並且根檔案系統中也存在 linuxrc,但是仍然報錯。busybox是動態編譯的。出現這個問題,最先想到的就是busybox不能執行,肯定是由於某種原因執行不起來。這裡首先想...

根檔案系統移植(1) 根檔案系統介紹

一 什麼是根檔案系統 1 首先明白一點,我們的檔案在硬碟上的儲存並非是連續存放的,而是零散的存放在硬碟中的某些空餘扇區中的,這就導致了我們很難去檢視我們存放的檔案 因為人無法記住所有檔案存放在哪些扇區,已經扇區的順序 這時就有了我們的檔案系統,所以簡單來講,檔案系統就是對乙個儲存裝置上的資料和元資料...

分析Android 根檔案系統啟動

在android系統啟動時,核心引導引數上一般都會設定 init init 這樣的話,如果核心成功掛載了這個檔案系統之後,首先執行的就是這個根目錄下的init程式。這個程式所了什麼呢?我們只有rfsc read the ing source code init程式原始碼在android官方原始碼的s...