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状态。


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值