注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

busybox-1.7.0分析  

2012-08-14 14:18:00|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我们接着上一节:

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");

如果没有在命令行指定:init=xxx的话,就会调用:
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
中的一个,这是内核启动的第一个,也是唯一一个应用进程!
一般会运行第一个init进程,就是/sbin/init,这个init命令可以通过busybox来编译得到,所以我们需要从busybox的init.c文件开始分析!

init_main
     parse_inittab
          file = fopen(INITTAB, "r");//打开配置文件,#define INITTAB      "/etc/inittab"
          如果没有配置文件的话,就会调用new_init_action函数
          这个函数用来创建init_action结构体,并将其放入链表
          那么这个init_action链表就相当于配置文件了inittab了
 
inittab文件的每一行对应一个子进程
我们先来看一下inittab文件的格式:
<id>:<runlevels>:<action>:<process>
id:表示这个子进程要使用的控制台
runlevels:省略
action:表示init进程如何控制这个子进程
process:要执行的程序

我们假设没有配置文件,我们来反推出默认的配置文件:
new_init_action(CTRLALTDEL, "reboot", "");
new_init_action(SHUTDOWN, "umount -a -r", "");
if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
new_init_action(RESTART, "init", "");
new_init_action(ASKFIRST, bb_default_login_shell, "");
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);
new_init_action(SYSINIT, INIT_SCRIPT, "");

::ctrcaltdel:reboot
::shutdown:umount -a -r
::restart:init
::askfirst:-/bin/sh
/dev/tty2::askfirst:-/bin/sh
/dev/tty3::askfirst:-/bin/sh
/dev/tty4::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS


接着分析:
init_main
     parse_inittab
     run_actions(SYSINIT);//系统启动期间首先启动action为sysinit、wait、once的子进程
     run_actions(WAIT);
     run_actions(ONCE);
     while(1){
     run_actions(RESPAWN); //系统正常运行期间,启动action为respawn、askfirst的两类子进程
     run_actions(ASKFIRST);  //并监视他们,发现某个子进程退出时,就重新启动它!
     
     }

到此为止,整个大的框架我们就分析完了,下面我们就用最简单的语言来做一个总结:

首先u-boot的start.S文件里有入口函数,进行了一系列的硬件初始化、设置命令、参数等工作之后,调用theKernel函数跳转到内核的入口函数,在head.S文件里面,接着会做解析参数等工作,最终调用run_init_process启动第一个也是唯一一个init进程,这个init进程的入口函数在busybox的init.c函数里面,接下来就会读取配置文件启动各个应用程序!
  评论这张
 
阅读(966)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017