Tina System Init 流程分析
-
init 进程是内核启动的第一个用户进程,它根据配置文件决定启动那些程序,比如执行某些脚本、启动 shell、运行用户指定的程序等。init 进程是后续所有进程的发起者,比如init进程启动 /bin/sh 程序后,才能在控制台输入各种命令。
init进程的执行程序通常是在/sbin/init,上面讲述的 init 进程的作用只不过是 /sbin/init 这个程序的功能。我们完全可以编写自己的 /sbin/init 程序,或者传入命令行参数“init=xxxx”指定某个程序作为init进程运行。
tina系统中目前支持两种init程序:procd init 和 busybox init。下面我们来简单分析下kernel是如何调用第一个用户进程。
如上图所示,内核启动的第一个c语言入口函数为 start_kernel(), 在函数中:会设置与体系结构相关的环境变量,初始化控制台,以及挂载根文件系统,最后启动 init 进程。
其中的 run_init_process 函数使用它的参数所指定的程序来创建第一个用户进程。
(1)如果 ramdisk_execute_command 变量指定了要运行的程序,则启动它。
ramdisk_execute_command 的取值分三种情况,
1)如果命令行参数指定了“rdinit=xxx”,则ramdisk_execute_command等于这个参数指定的程序
2)否则,如果/init程序存在,ramdisk_execute_command就等于“/init”。
3)否则,ramdisk__execute_command为空
(2)如果execute_command变量指定了要运行的程序,启动它。
如果命令行参数指定了"init=...",则execute_command等于这个参数指定的程序,否则为空
(3)如果 ramdisk_execute_command 和 execute_command 参数都没有指定,则依次执行 ”/sbin/init、/etc/init、/bin/init、/bin/sh“在tina系统中,我们可以通过去修改env.cfg文件 ”rdinit=xxx“ 或 ”init=xxx“ 参数来指定启动的第一个用户进程
example:
tina/target/allwinner/azalea-m2ultra/configs下,修改env-3.10.cfg(如果没有这个文件,则到tina/target/allwinner/generic/configs/拷贝一份env-3.10.cfg到tina/target/allwinner/azalea-m2ultra/configs/),修改文件中的”init=‘指定的应用进程’ “即可
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号