openwrt 內核完成後的初始過程。


如上圖所示:linux內核啓動完成後,執行的第一個程序中/etc/preinit。由此此時環境變量PREINIT爲空,所以馬上執行/sin/init
/sbin/init是由procd/init.c編譯而來。它先執行一些early cmdline等。最後執行preinit()函數。
preinit函數,配置了環境變量PREINIT,再一次fork了/etc/preinit。
/etc/preinit執行完成後,進程消失後,調用了回調函數spawn_procd
spawn_procd則execp("procd")
procd再去執行/etc/init.d/*文件。啓動各個服務。

第二次執行 /etc/preinit的過程:

preinit功能由幾個腳本組成,主腳本是/etc/preinit,它會讀取其它的腳本【其中hook_XX函數庫在/lib/functions/preinit.sh。其它功能性的腳本在/lib/preinit/*】。它定義了一些函數掛到hook上.當運行時,這些hook們會啓動函數按函數加入的順序。

hook點如下:
preinit_essential
preinit_main
failsafe
initramfs
preinit_mount_root

這些hook點說白了就是一個保存一些函數名+空格的字符串。如preinit_essentail的hook就是變量:preinit_essentail_hook
使用boot_hook_add把 一些函數名[名的字符串加入相關變量中。示例:boot_hook_add preinit_main define_default_set_state  ## export -n preinit_main_hook=define_default_set_state
使用 boot_run_hook時,把從hook的變量中取出函數來並一一執行。
示例代碼:boot_run_hook preinit_main ## export -n PI_RAN_define_default_set_state=1 export -n PI_RAN_define_default_set_state=1


procd啓動各服務
procd: - early -   //初始化看門狗。
procd: - watchdog -
procd: - ubus -
procd: - init -
如上日誌表示了procd的初始化過程。
procd有幾個state。state_enter函數爲狀態機處理入口。
STATE_NONE -->STATE_EARLY -->STATE_UBUS-->STATE_INIT-->STATE_RUNNING

STATE_NONE :什麼也不幹。
STATE_EARLY :初始化看門狗等。
STATE_UBUS:與ubusd建立socket.
STATE_INIT:讀取/etc/initab中的條目,爲每一個條目建議一個action(其中有cb處理函數)。再依次執行
respawn,askconsole,askfirst,sysinit的action.
執行完成sysinit後則進程了STAT_RUNNING狀態。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章