1、init\init.c
init_main()
/* Check if we are supposed to be in single user mode */
if (argv[1]
&& (strcmp(argv[1], "single") == 0 || strcmp(argv[1], "-s") == 0 || LONE_CHAR(argv[1], '1'))
) {
/* ??? shouldn't we set RUNLEVEL="b" here? */
/* Start a shell on console */
new_init_action(RESPAWN, bb_default_login_shell, "");
} else {
/* Not in single user mode - see what inittab says */
/* NOTE that if CONFIG_FEATURE_USE_INITTAB is NOT defined,
* then parse_inittab() simply adds in some default
* actions(i.e., INIT_SCRIPT and a pair
* of "askfirst" shells */
parse_inittab();
}
此段按照韦老师的视频会先执行parse_inittab()函数
2、parse_inittab()
parser_t *parser = config_open2("/etc/inittab", fopen_for_read);//打开配置文件
3、examples\inittab
用于启动不同的运用程序
inittab格式:
Format for each entry: <id>:<runlevels>:<action>:<process>
id => /dev/id,用作终端:标准输入、标准输出、标准错误;
runlevels :忽略
action:执行时机
process:应用程序或脚本
4、new_init_action()函数
通过如下程序解析:
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
通过参数查找可就上程序替代变更为如下函数:
static void new_init_action(uint8_t action_type, const char *command, const char *cons)
new_init_action(ASKFIRST, "-/bin/sh", "/dev/tty2");
通过new_init_action函数的参数对比前面inittab格式,可以看到
action_type对应action:执行时机
const char *command对应process:应用程序或脚本
const char *cons 对应id => /dev/id 终端
new_init_action函数功能
①创建一个init_action结构,填充;
②把这个结构放入init_action_list链表;
这个链表大概有如下内容:
可以通过代码反推出
/* No inittab file - set up some default behavior */
/* Reboot on Ctrl-Alt-Del */
new_init_action(CTRLALTDEL, "reboot", "");
/* Umount all filesystems on halt/reboot */
new_init_action(SHUTDOWN, "umount -a -r", "");
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF)
new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a QUIT is received */
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
//TODO: VC_1 instead of ""? "" is console -> ctty problems -> angry users
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
/* sysinit */
new_init_action(SYSINIT, INIT_SCRIPT, "");
5、执行进程
run_actions(SYSINIT);
run_actions(WAIT);
run_actions(ONCE);
run_actions(RESPAWN | ASKFIRST);
最开始执行的是"SYSINIT"类的进程,具体执行可参考run_actions()函数,每类进程运行都有一定的区别。
6、总结
最小的根文件系统包括:
①/dev/console /dev/null
②/sbin/init
③/etc/inittab
④配置文件制定的运用程序
⑤C库