韦东山第11课-根文件系统init进程分析

本文详细解析了BusyBox系统的启动过程,包括设备文件创建、文件系统挂载、init进程执行等关键步骤,并深入介绍了init程序如何通过解析inittab文件来启动系统服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的源码。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值