Init进程
嵌入式系统中命令都指向busybox
程序,busybox
是一系列命令的组合。
所以当执行ls
时,实际上是执行busybox ls
。
init
程序的目的是启动用户应用程序。
过程大概是:读取配置文件、根据配置文件配置运行环境、启动用户程序。
busybox
首先调用init_main()
函数。
init_main()
函数首先设置信号处理函数``:
/* Set up sig handlers -- be sure to
* clear all of these in run() */
signal(SIGHUP, exec_signal);
signal(SIGQUIT, exec_signal);
signal(SIGUSR1, shutdown_signal);
signal(SIGUSR2, shutdown_signal);
signal(SIGINT, ctrlaltdel_signal);
signal(SIGTERM, shutdown_signal);
signal(SIGCONT, cont_handler);
signal(SIGSTOP, stop_handler);
signal(SIGTSTP, stop_handler);
然后控制台初始化console_init();
设置标准输入输出和错误输出,指向/dev/console
设备。
然后调用parse_inittab()
函数寻找配置文件,parse_inittab()
里面打开
file = fopen(INITTAB, "r");
其中
#define INITTAB "/etc/inittab" /* inittab file location */
我们可以查阅inittab
说明文档了解inittab
的格式:
Format for each entry: <id>:<runlevels>:<action>:<process>
inittab
的默认配置是:
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
其中<process>
:是指定需要执行的命令或者程序。
读取完inittab
配置文件后运行new_init_action
函数解析配置文件。
然后init_main
函数继续执行run_actions
函数,run_actions
是根据配置文件<process>
来创建对应的子进程执行程序。
综上:最小的根文件系统需要的项:(init进程需要)
- 打开终端:
/dev/ console
,/dev/NULL
不设置 >inittab
格式中的d(标准输入、输出和标准错误)时,就定位到/dev/NUL
中去。- int程序本身就是 busybox
- 需要配置文件:
etc/inittab
- 配置文件若指定了某些应用程序或执行脚本-这些必须存在,不存在会有默认的。
- 应用程序需要库( fopen、 fwrite等函数需要)