1 前言
创建设备文件:
mknod /dev/ttySAC0 c 4 64
mknod /dev/hda1 b 3 1
挂载文件/目录:
mount -t tmpfs none /tmp
printf() scanf() err()
接着上一讲的init_post()函数:
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
(void) sys_dup(0);
(void) sys_dup(0);
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
。。。。。。
//初始化的程序,明显系统跑的是这四个之一,优先级从上到下
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
到此为止程序执行/sbin/init;
开始执行文件系统的函数:
2 文件系统函数执行流程:
init_main()
parse_inittab();
file = fopen(INITTAB, "r"); //打开"/etc/inittab" ; /etc/inittab init(8) configuration for BusyBox <id>:<runlevels>:<action>:<process>
while(){
new_init_action(a->action, command, id); //得到应用程序的列表;如下默认情况下的分析
}
run_actions(SYSINIT); //运行这一类动作
waitfor(a, 0); //执行应用程序等带它结束
run(a); //创建process子进程
waitpid(runpid, &status, 0); // 等待它结束
delete_init_action(a); //从链表中删除
run_actions(WAIT);
waitfor(a, 0); //执行应用程序等带它结束
run(a); //创建process子进程
waitpid(runpid, &status, 0); // 等待它结束
delete_init_action(a); //从链表中删除
run_actions(ONCE);
run(a); //创建process子进程
delete_init_action(a); //从链表中删除
while (1) {
run_actions(RESPAWN);
if(a->pid == 0){
a->pid =run(a);
}
run_actions(ASKFIRST);
if(a->pid == 0){
a->pid =run(a);
}
wpid=wait(NULL); //等带子进程退出
while(wpid>0:
{
a->pid=0; //推出后设置pid=0
}
}
3 对下节的承接内容
构建根文件系统最少要有:
/dev/console
/dec/null
/sbin/init
/etc/inittab
配置文件指定的程序
库
new_init_action(a->action, command, id);作用:
(1 创建一个init_action结构,填充
(2 把这个结构放入init_action链表
来分析默认的new_init_action()结构(反推):<id>:<runlevels>:<action>:<process>
id:作为 终端,stdin stdout printf
runlevels:忽略
action:执行时机
process:应用程序或者脚本
if (file == NULL) {
/* No inittab file -- set up some default behavior */
#endif
/* Reboot on Ctrl-Alt-Del */
new_init_action(CTRLALTDEL, "reboot", ""); //::CTRLALTDEL:reboot
/* Umount all filesystems on halt/reboot */
new_init_action(SHUTDOWN, "umount -a -r", ""); //::SHUTBOWN:umount -a -r
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a HUP is received */
new_init_action(RESTART, "init", ""); //::RESTART:init
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, ""); // ::ASKFIRST: bb_default_login_shell
new_init_action(ASKFIRST, bb_default_login_shell, VC_2); // ::VC_2ASKFIRST:bb_default_login_shell
new_init_action(ASKFIRST, bb_default_login_shell, VC_3); // VC_3::ASKFIRST:bb_default_login_shell
new_init_action(ASKFIRST, bb_default_login_shell, VC_4); // VC_4::ASKFIRST:bb_default_login_shell
/* sysinit */
new_init_action(SYSINIT, INIT_SCRIPT, ""); //::RESTART:init
return;
#if ENABLE_FEATURE_USE_INITTAB
}
<id>:<runlevels>:<action>:<process>
开机后可以用ps命令查看有哪些命令在跑;
linux命令ls cp 等都是指向busybox的命令,所以要看busybox的源码。