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...