内核启动流程3--Busybox的init进程
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进程的更多相关文章
- 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)
本次实验过程如下: 1. 运行MenuOS系统 在实验楼的虚拟机环境里,打击打开shell,使用下面的命令 cd LinuxKernel/ qemu -kernel linux-/arch/x86/b ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- Linux内核启动流程(简介)
1. vmlinux.lds 首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的: 第 ...
- 实验六:通过grub程序引导本地磁盘内核启动系统(busybox)
实验名称: 通过grub程序引导本地磁盘内核启动系统(busybox) 实验环境: 理论上,该实验只需要配置好xen环境即可,但是,我们的xen环境安装在centOS7上,但是我们又是使用的kerne ...
- linux 内核启动流程分析,移植
分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...
- linux 内核启动流程
Linux内核启动流程详细分析: http://www.linuxidc.com/Linux/2014-10/108034.htm ARM Linux内核启动过程: http://blog.csdn. ...
- Tiny4412 Linux 内核启动流程
Linux内核的启动分为压缩内核和非压缩内核两种,这里我们以压缩内核为例.压缩内核运行时,将运行一段解压缩程序,得到真正的内核镜像,然后跳转到内核镜像运行.此时,Linux进入非压缩内核入口,在非压缩 ...
- Linux启动流程和服务管理(init和systemd)
目录 一:Linux启动流程 init和Systemd的区别 二:Linux服务管理(service,systemctl) 一:Linux启动流程 Rhel6启动过程: Rhel7启动过程: GRUB ...
随机推荐
- android OTG【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7707056 一.OTG的概念 OTG是On-The-Go的缩写,是近年发展起来的技术, ...
- nginx expires缓存提升网站负载
语法: expires [time|epoch|max|off]默认值: expires off作用域: http, server, location使用本指令可以控制HTTP应答中的“Expires ...
- ios UIImageWriteToSavedPhotosAlbum报错 NSPhotoLibraryAddUsageDescription
最近学习IOS相关知识. 视频课程[UIImage](https://www.imooc.com/video/12718) 相关知识点: 存储一张本地图片到系统相册中. API: UIImageWri ...
- Linux Glibc库严重安全漏洞修复方案通知(腾讯开发者社区)
如何查看当前glibc的版本号? rpm -aq | grep glibc 尊敬的用户: 您好!2015年1月28日, 腾讯云安全情报监测到LinuxGlibc库存在一处严重安全漏洞,可以 ...
- CodeForces 455C Civilization(并查集+树直径)
好久没有写过图论的东西了,居然双向边要开两倍空间都忘了,不过数组越界cf居然给我报MLE??这个题题意特别纠结,一开始一直不懂添加的边长是多长... 题意:给你一些点,然后给一些边,注意没有重边 环, ...
- HDU 4267 A Simple Problem with Integers(2012年长春网络赛A 多颗线段树+单点查询)
以前似乎做过类似的不过当时完全不会.现在看到就有点思路了,开始还有洋洋得意得觉得自己有不小的进步了,结果思路错了...改了很久后测试数据过了还果断爆空间... 给你一串数字A,然后是两种操作: &qu ...
- 大数据日志分析产品——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 ...
- flex与js交互浅析
1.flex调用js方法 调用方法例如:ExternalInterface.call("UploadComplete",oldName,uidName,_dir+"/&q ...
- Idea_学习_06_IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示
二.参考资料 1.IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示
- (转)gcov、lcov与genhtml 使用心得
gcc是linux平台下的C.C++ 编译器 gcov是配合gcc产生覆盖信息报告的工具: lcov是将gcov产生的报告信息,以更直观的方式显示出来工具 基本的使用方法分为4个阶段: (一).gcc ...