嵌入式linux 根文件系统的启动及配置

busybox 的init主要用于嵌入式系统,所以没有运行级别。

::respawn:-/bin/login -froot 自动作为root用户登录。

在Linux内核中找到/init/main.c  看到如下内容:

 run_init_process("/sbin/init");
 run_init_process("/etc/init");
 run_init_process("/bin/init");
 run_init_process("/bin/sh");

这里就是执行系统的启动,当满足上面其中之一后,系统就会执行启动进程。一般通过busybox编译后的init在/sbin/下,所以通过第一条命令,下面就需要找到init,分析源码。

在busybox源码的/init/init.c中,有#define INITTAB      "/etc/inittab"的定义,inittab的作用自不必再说了,系统会根据inittab的提示进行启动加载。但在在解析inittab时,若没有该文件,便会执行新的启动脚本#defineINIT_SCRIPT "/etc/init.d/rcS"。

rcS就是整个系统启动的关键。

在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤:

1. 执行/sbin/init 文件

2. 执行/etc/inittab 文件

3. 执行/etc/init.d/rcS 文件

4. 执行挂载文件系统脚本

5. 执行内核模块脚本

6. 执行网络初始化脚本

7. 执行应用程序启动等脚本,如qtopia 的启动

 

 

系统启动流程图:

1. 内核启动init

内核启动的最后一步就是启动init 进程,init 进程是由内核启动的第一个(也是唯一一个和)用户进程(进程ID 为1),它根据配置文件决定启动哪些程序,比如某些脚本, 启动shell ,运行用户指定的程序等,,那么init进程又是怎么启动的呢---是由内核调用/sbin/init 文件而启动的,那有人就有人想知道内核是如何找到需要执行的init文件呢。下面看一下内核代码中init/main.c ,如下所示:

static int noinline init_post(void)

{

free_initmem();

unlock_kernel();

mark_rodate_ro();

system_state=SYSTEM_RUNNING;

numa_default_policy();

 

if(sys_open((const char __user*) “/dev/console”,O_RDWR,0)<0)

printk(KERN_WARNING “Waring :unable to open an initialconsole.\n”);

 

(void)sys_dup(0);

(void)sys_dup(0);

 

if(ramdisk_execute_command) {

run_init_process(ramdisk_execute_command);

printk(KERN_WARNING “Failed to execute%s\n”,ramdisk_execute_command);

}

 

if(execute_command) {

run_init_process(execute_command);

printk(KERN_WARNING “Failed to execute%s\n”,execute_command);

}

 

run_init_process(“/sbin/init”);

run_init_process(“/etc/init”);

run_init_process(“/bin/init”);

run_init_process(“/bin/sh”);

panic(“No init found . Try passing init=option to kernel.”);

内核启动init 进程的过程如下:

先打开控制台设备/dev/console ,并复制了两个handle, 这样stdout,stdin,stderr都指向/dev/console,这样就打开了标准设备输入,输出,标准错误设备,然后执行几个外部程序。这几个程序中任何一个加载成功就进入了用户态,内核启动就宣告结束。

 

2. 执行/etc/inittab 文件

当init 启动成功后,需要做的就是分析/etc/inittab 文件并执行它。其内容如下:

# /etc/inittab

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

# 启动shell 以/dev/ttySAC0 作为控制台

ttySAC0::askfirst:-/bin/sh

 

 

# 按下ctrl

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值