云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > ARM-Linux移植之(三)——init进程启动流程分析

ARM-Linux移植之(三)——init进程启动流程分析

  • 62 次阅读
  • 3 次下载
  • 2025/5/3 18:48:13

ARM-Linux移植之(三)——init进程启动流程分析

Y-Kee

转载请注明来自于衡阳师范学院08电2 Y-Kee http://blog.csdn.net/ayangke, QQ:843308498

我们通常使用Busybox来构建根文件系统的必要的应用程序。Busybox通过传入的参数来决定执行何种操作。当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分析这个函数,看init进程究竟是怎样一个流程。我分析的Busybox源码是1.7.0版本的,其他版本会略有不同。部分代码省略我们只看关键性代码。

首先看init_main函数

int init_main(int argc, char **argv); int init_main(int argc, char **argv) {

…………………………….. …………………………….. //初始化控制台 console_init();

………………………………

if (argc > 1

&& (!strcmp(argv[1], \) {

new_init_action(RESPAWN, bb_default_login_shell, \} else { }

//因为我们启动的init进程没有任何参数,所有argc==1,执行的是这一句 parse_inittab();

………………………………………… ………………………………………… run_actions(SYSINIT); run_actions(WAIT);

run_actions(ONCE);

……………………………………………… while (1) {

run_actions(RESPAWN); run_actions(ASKFIRST); wpid = wait(NULL); while (wpid > 0) { a->pid = 0;

}

}

}

wpid = waitpid(-1, NULL, WNOHANG);

parse_inittab实际上对/etc/inittab文件里面的配置进行解释,如果没有,则设置一些默认设置。

我们先来看看这个inittab这个文件里面的配置格式,这个在busybox文件里面的inittab文件里面有说明

:::

id表示输出输入设备,这个不需要设置,因为/etc/console已经设为标准输入输出了,如不设置,则从控制台输入输出。

runlevels 这个参数完全忽略

action 运行时机,它表示inittab解释后的运行顺序,它有sysinit, respawn, askfirst, wait, once,restart, ctrlaltdel, and shutdown.这个值可选择。 process 就是要启动的进程。

下面来看prase_inittab这个函数 static void parse_inittab(void) {

………………………………………………… …………………………………………………

/*INITTAB是一个宏 #define INITTAB \可以看得出来它打开了/etc/inittab这个文件*/ file = fopen(INITTAB, \

//如果没有这个文件,则调用new_init_action进行一些默认的操作 if (file == NULL) {

new_init_action(CTRLALTDEL, \

new_init_action(SHUTDOWN, \

if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, \new_init_action(RESTART, \

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, \ }

return;

………………………………………………… …………………………………………………

/*果inittab文件里面有内容就将里面的内容一行一行读出来,然后调用

new_init_action进行操作*/ while (fgets(buf, INIT_BUFFS_SIZE, file) != NULL) { /* Ok, now process it */ for (a = actions; a->name != 0; a++) {

}

fclose(file);

if (strcmp(a->name, action) == 0) { if (*id != '\\0') {

}

if (strncmp(id, \ id += 5; strcpy(tmpConsole, \safe_strncpy(tmpConsole + 5, id,

sizeof(tmpConsole) - 5); id = tmpConsole;

new_init_action(a->action, command, id); break;

} }

………………………………………………… …………………………………………………

}

这个new_init_action函数,它实际上是将inittab里面的action相同的操作串成一个链表。

下面我们再来分析init_main执行prase_inittab之后执行的操作

可以看出init_main执行prase_initab对inittab文件里面的配置进行解释之后,会先执行运行时机为SYSINIT的进程,让执行WAIT时机的,接着是ONCE的,然后在一个while(1)函数里面运行RESPAWN和ASKFIRST时机的,一旦这两个时机里面的进程被杀死,就会把他们的pid赋为0,然后跳到while(1)函数的开始处又去启动他们。所有说运行时机为RESPAWN和ASKFIRST的进程永远无法杀死,除非reboot或者shutdown。

下面我们来总结一下init进程的启动过程 1.初始化控制台 2.解释inittab

3.执行inittab运行时机为SYSINIT的进程 4.执行inittab运行时机为WAIT的进程 5.执行inittab运行时机为ONCE的进程

6.执行inittab运行时机为RESPAWN和ASKFRIST的进程,有退出的则重新执行。

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

ARM-Linux移植之(三)——init进程启动流程分析 Y-Kee 转载请注明来自于衡阳师范学院08电2 Y-Kee http://blog.csdn.net/ayangke, QQ:843308498 我们通常使用Busybox来构建根文件系统的必要的应用程序。Busybox通过传入的参数来决定执行何种操作。当init进程启动时,实际上调用的是Busybox的init_main()函数,下面我们来分析这个函数,看init进程究竟是怎样一个流程。我分析的Busybox源码是1.7.0版本的,其他版本会略有不同。部分代码省略我们只看关键性代码。 首先看init_main函数 int init_main(int argc, char **argv); int init_main(int ar

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com