嵌入式Linux启动过程分析9-root

1.移植busybox
2.拷贝形成相应的库文件
3.修改配置文件

移植busybox
1.配置make menuconfig生成配置
2.修改Makefile
3.make 指定相应的CONFIG_PREFIX否则会覆盖操作系统原有的文件,导致系统崩溃


形成库文件
将gcc-3.4.5-glibc-2.3.6解压后,将*.so*文件拷贝到 /lib目录下


修改配置文件
1.修改etc/inittab
2.etc/init.d/rcS文件
3.etc/fstab文件
4.创建/dev/null /dev/console
5.使用mdev进行自动挂载



内核如何启动应用程序
init进程是由内核启动的第一个(也是唯一一个)用户进程,他根据配置文件决定启动哪些程序,比如,由init进程可以启动用户指定的程序,或启动shell,或执行某些配置脚本.Init进程是后续所有进程的发起者

内核调用执行busybox的init进程
在linux内核的init/main.c中init_post函数
1.首先打开/dev/console设备
2.初始化标准设备:标准输入、输出、错误
3.如果ramdisk_execute_command变量指定了要运行的程序,启动它
    1.命令参数中rdinit=.....则ramdisk_execute_command等于这个参数指定的程序
    2.如果/init程序存在,ramdisk_execute_command等于/init
    3.否则ramdisk_execute_command为空
4.如果execute_command变量指定了要运行的程序,启动它
    命令参数中指定了init=.....则execute_command
5.否则尝试运行/sbin/init,/etc/init,/bin/init,/bin/sh



busybox的init进程对应init/init.c文件,对应init_main函数
1.设置信号等(如ctrl+alt_del信号等)
2.控制台初始化
3.设置一些全局变量
4.parse_inittab解析配置文件,如果有解析,没有使用默认操作。解析完成后调用new_init_action()
    函数会打开/etc/inittab文件
    inittab格式为<id>:<runlevel>:<action>:<process>
    id:用作终端设备
    runlevel:忽略
    action:何时执行
    process:应用程序或脚本
    解析inittab文件,将解析后的结果放入一个链表中
    1.new_init_action(......)//创建一个init_action结构并填充,一个节点
    2.将上述节点放入init_action_list链表中(之前有覆盖,之前没有新建)

5.run_actions(SYSINIT)------>waitfor(run(a));delete_init_action(a);//执行应用程序a,等待执行完成,从列表中删除相应的项
  run_actions(WAIT)------>同上
  run_actions(ONCE)------->run(a);delete_init_action(a)//运行a,并删除列表中的相应项,不会等待程序运行完成
  while(1)
  {
    run_actions(RESPAWN)
       if(a->pid==0)
        a->pid=run(a);
    run_actions(ASKFIRST)
       if(a-pid==0)
        a->pid=run(a);
    wpid=wait(NULL)
    while(wpid>0)  //等待子进程退出
    {
        a->pid=0  //推出后,设为0.while循环可以重新执行已经退出的子进程
    }
  }



设置号/etc目录下的配置文件 C库 相应的设备  busybox生成的可执行程序
所有移植工作完成

OKOKOKOKOKOKOKOK

完成所有的移植工作,可以进行用户应用程序的开发

你可能感兴趣的:(嵌入式Linux启动过程分析9-root)