linux kernel啓動是從./init/main.c中開始的,其大概流程是:
1. 調用start_kernel()函數;
2. start_kernel()調用rest_init()函數;
3. rest_init()調用kernel_init()函數;
4. kernel_init()調用init_post()函數;
5. init_post()調用run_init_process()函數去建立init進程,
這個函數中的代碼以下:
run_init_process("/init");
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
這時由於run_init_process()函數建立init進程成功後就不會返回了。linux
init程序會作哪些事呢?
1. 讀/etc/inittab,從中讀取當前系統預設的run level,
sh-# cat /etc/inittab
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $shell
# The default runlevel.
id:4:initdefault:
....
sh-# exit
exit
INIT: Entering runlevel: 4函數
2. 根據讀出的run level的值,選擇執行不一樣的服務,好比:
若是系統預設的run level值爲4,那麼執行配置在/etc/rc4.d/下的服務;
若是系統預設的run level值爲5,那麼執行配置在/etc/rc5.d/下的服務。
用戶本身的程序都是根據須要,進行相應的配置。post
以上,linux kernel就啓動起來了。spa
在shell下驗證查看,init進程所執行的程序就是預設的/sbin/init程序。
sh-# ls -l /sbin/init
-rwxr-xr-x 1 root root 28323 Oct 10 03:00 /sbin/init
sh-# ls -l /proc/1/exe
lrwxrwxrwx 1 root root 0 Oct 10 06:19 /proc/1/exe -> /sbin/init
sh-#rest