Busybox是用来制作文件系统的一个工具集,可以用来替换GNU fileutils shellutils等工具集,它为各种小型的或者嵌入式系统提供了比较完全的工具集。

它提供的核心程序中包括了用户空间的init进程。用户空间的init进程是整个系统启动流程的最后一个阶段,经过该进程的初始化,整个系统进入服务状态,提供诸如系统调用、任务管理服务及设备管理等服务。

1)init进程启动流程

busybox中实现的init进程一般放在开发板的"/sbin"目录下。

busybox的init进程会根据配置文件决定启动哪些程序,如执行某些脚本、启动shell、运行用户指定的程序等。总之,该init进程将成为后续所有进程的发起者,如在init进程启动"/bin/sh"程序后,才能在控制台上输入各种命令。

busybox的init程序对应代码在busybox的init/init.c下,其初始化流程如下

其中与构建根文件系统关系密切的是控制台的初始化、对inittab文件的解释及执行。

2)添加初始化活动

init进程的初始化任务被分解为一系列初始化活动来完成,busybox定义了8种初始化活动,

Sysinit:为init进程提供初始化命令脚本的路径。

Wait:告诉init进程必须等到相应的进程执行完成之后,才能继续执行。

Once:仅执行相应的进程一次,而且不会等待它执行完成。

Respawn:当相应的进程终止执行时,重新启动该进程。

Askfirst:与respawn类似,不过init进程先输出“please press enter to active this console”,等用户按回车键之后,才启动子进程。

Shutdown:当系统关机时,执行相应的进程。

Restart:当init进程重新启动时,执行相应的进程,通常此处执行的进程就是init本身。

Ctrlatldel:当按下crtl+alt_delete组合键时,执行相应的进程

init进程中需要添加的活动,通常被写到inittab文件中,inittab文件通常位于根文件系统的"/etc"目录下,其中每一条配置信息定义一个初始化活动。格式如下:

<id>:<runlevels>:<action>:<process>

inittab中的每个条目有4个字段,各字段间由冒号分开。

<id>:表示该进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与init进程一样的控制台。

<runlevels>:对于busybox提供的init程序,这个字段没有意义,可以省略

<action>:表示init进程如何控制该子进程

<process>:要执行的进程,它可以是可执行程序,也可以是脚本

一个简单的inittab示例:

::sysinit:/etc/init.d/rcS

::askfirst:-/bin/sh

::ctrllaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

在init_main()函数中调用parse_inittab()函数解析inittab,也正是在该函数中完成向init进程添加活动的任务。尽管没有inittab文件,parse_inittab()中也会添加默认的活动,如下

static void parse_inittab(void)

{

  #if ENABLE_FEATURE_USE_INITTAB

  char *token[4];

  parser_t *parser = config_open2("/etc/inittab",fopen_for_read);

  if(parser == NULL)

  #endif

  {

    /*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","");

    new_init_action(RESTART,"init","");

    /*sysinit*/

    new_init_action(SYSINIT,INIT_SCRIPT,"");

    return;

  }

}

new_init_action函数的三个参数分别表示活动类型、相关的命令和使用的控制台,若不指定最后一个参数,则表示使用与init进程相同的控制台。

最后一个新的初始化活动,即当SYSINIT活动发生时,由INIT_SCRIPT确定的脚本被执行。SYSINIT活动表示只在系统初始化阶段被init进程加载一次。INIT_SCRIPT宏的默认值定义如下,BUSYBOX init进程默认的初始化脚本是/etc/init.d/rcS

#define INITTAB  "/etc/inittab"

#ifndef INIT_SCRIPT

#define INIT_SCRIPT  "/etc/init.d/rcS"

#endif

parse_inittab()函数的其余代码解析inittab文件的具体内容,最终根据Inittab中给定的配置,向init进程添加各项活动。

3)执行初始化活动

init进程解析inittab后开始执行各类初始化活动。它通过run_actions()函数执行指定类型的初始化活动,并为符合条件的活动,执行其 相关命令。init进程各类初始化活动的执行顺序如下:

/*First run the sysinit command*/

run_actions(SYSINIT);

/*Next run anything that wants to block*/

run_actions(WAIT);

/*Next run anything to be run ony once*/

run_actions(ONCE);

.....

/*Now run the looping stuff for the rest of forever*/

while(1)

{

  /*run the respawn/askfirst stuff*/

  run_actions(RESPAWN|ASKFIRST);

  /*Don't consume all CPU time--sleep a bit*/

  sleep(1);

  /*wait for any child process to exit*/

  wpid = wait(NULL);

  while(wpid>0)

  {

    /*Find out who died and clean up their corpse*/

    .....

  }

}

从上面的代码可以看出,活动的执行顺序如下:

1)执行系统初始化脚本,默认为/etc/init.d/rcS,活动类型为SYSINIT;

2)执行所有将会导致阻塞的初始化活动对应的命令,活动类型是WAIT;

3)执行所有一次执行的初始化活动的命令,活动类型是ONCE;

完成以上工作后,init循环执行以下任务:

1)执行所有中止后必须重启的活动命令,类型是RESPAWN。

2)执行所有中止后必须重启,但必须先询问的活动命令,类型是ASKFIRST。

3)等待子进程推出。

内核启动流程3--Busybox的init进程的更多相关文章

  1. 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)

    本次实验过程如下: 1. 运行MenuOS系统 在实验楼的虚拟机环境里,打击打开shell,使用下面的命令 cd LinuxKernel/ qemu -kernel linux-/arch/x86/b ...

  2. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  3. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  4. Linux内核启动流程(简介)

    1. vmlinux.lds 首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的: 第 ...

  5. 实验六:通过grub程序引导本地磁盘内核启动系统(busybox)

    实验名称: 通过grub程序引导本地磁盘内核启动系统(busybox) 实验环境: 理论上,该实验只需要配置好xen环境即可,但是,我们的xen环境安装在centOS7上,但是我们又是使用的kerne ...

  6. linux 内核启动流程分析,移植

    分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...

  7. linux 内核启动流程

    Linux内核启动流程详细分析: http://www.linuxidc.com/Linux/2014-10/108034.htm ARM Linux内核启动过程: http://blog.csdn. ...

  8. Tiny4412 Linux 内核启动流程

    Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...

  9. Linux启动流程和服务管理(init和systemd)

    目录 一:Linux启动流程 init和Systemd的区别 二:Linux服务管理(service,systemctl) 一:Linux启动流程 Rhel6启动过程: Rhel7启动过程: GRUB ...

随机推荐

  1. android OTG【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7707056 一.OTG的概念 OTG是On-The-Go的缩写,是近年发展起来的技术, ...

  2. nginx expires缓存提升网站负载

    语法: expires [time|epoch|max|off]默认值: expires off作用域: http, server, location使用本指令可以控制HTTP应答中的“Expires ...

  3. ios UIImageWriteToSavedPhotosAlbum报错 NSPhotoLibraryAddUsageDescription

    最近学习IOS相关知识. 视频课程[UIImage](https://www.imooc.com/video/12718) 相关知识点: 存储一张本地图片到系统相册中. API: UIImageWri ...

  4. Linux Glibc库严重安全漏洞修复方案通知(腾讯开发者社区)

    如何查看当前glibc的版本号? rpm -aq | grep glibc 尊敬的用户:       您好!2015年1月28日, 腾讯云安全情报监测到LinuxGlibc库存在一处严重安全漏洞,可以 ...

  5. CodeForces 455C Civilization(并查集+树直径)

    好久没有写过图论的东西了,居然双向边要开两倍空间都忘了,不过数组越界cf居然给我报MLE??这个题题意特别纠结,一开始一直不懂添加的边长是多长... 题意:给你一些点,然后给一些边,注意没有重边 环, ...

  6. HDU 4267 A Simple Problem with Integers(2012年长春网络赛A 多颗线段树+单点查询)

    以前似乎做过类似的不过当时完全不会.现在看到就有点思路了,开始还有洋洋得意得觉得自己有不小的进步了,结果思路错了...改了很久后测试数据过了还果断爆空间... 给你一串数字A,然后是两种操作: &qu ...

  7. 大数据日志分析产品——SaaS Cloud, e.g. Papertrail, Loggly, Sumo Logic;Open Source Frameworks, e.g. ELK stack, Graylog;Enterprise Products, e.g. TIBCO LogLogic, IBM QRadar, Splunk

    Learn how you can maximize big data in the cloud with Apache Hadoop. Download this eBook now. Brough ...

  8. flex与js交互浅析

    1.flex调用js方法 调用方法例如:ExternalInterface.call("UploadComplete",oldName,uidName,_dir+"/&q ...

  9. Idea_学习_06_IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示

    二.参考资料 1.IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示

  10. (转)gcov、lcov与genhtml 使用心得

    gcc是linux平台下的C.C++ 编译器 gcov是配合gcc产生覆盖信息报告的工具: lcov是将gcov产生的报告信息,以更直观的方式显示出来工具 基本的使用方法分为4个阶段: (一).gcc ...