a、挂接根文件系统

内核怎样启动第一个应用程序 {

         b、启动应用程序

1、打开设备

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

  printk(KERN_WARNING "Warning: unable to open an initial console.\n");

(void) sys_dup(0);          复制

(void) sys_dup(0);            复制

"/dev/console" 里面为标准输入输出错误,printf 、scanf、err()  终端 现在为串口0

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

2、通过run_init_process启动应用程序具体哪一个依次优先考虑(执行后一去不复返):

a、命令行init = xxxxxxxxxxxxxxx(u-boot传过来的参数)

b、/sbin/init

c、............

d、.............

f、.............

构建根文件系统

busybox        ls  cp  cd ........

lrwxrwxrwx    1 1000     1000            7 Jan  6  2010 /bin/ls -> busybox

lrwxrwxrwx    1 1000     1000            7 Jan  6  2010 /bin/cp -> busybox

执行ls cp其实就是执行 busybox应用程序

lrwxrwxrwx    1 1000     1000           14 Jan  6  2010 /sbin/init -> ../bin/busybox

u-boot:启动内核

内核:启动应用程序 --》先启动 /abin/init -->启动客户程序

      1、配置文件

init程序 {   2、解析配置文件

      3、执行应用程序

busybox        --》 init_main

           parse_inittab

             file = fopen(INITTAB, "r");   //打开配置文件/etc/inittab

             new_init_action    //1、创建一个init_action结构,填充

                          //2、把这个结构放入init_action_list链表

           run_actions(SYSINIT);

             waitfor(a, 0);        //执行程序,等待它执行完毕

                run(a);       //创建process子进程

                waitpid(runpid, &status, 0);   //等待它结束

             delete_init_action(a);  //在init_action_list链表内删除

           run_actions(WAIT);

              waitfor(a, 0);        //执行程序,等待它执行完毕

                run(a);       //创建process子进程

                waitpid(runpid, &status, 0);   //等待它结束

             delete_init_action(a);  //在init_action_list链表内删除

  `         run_actions(ONCE);

                run(a);       //创建process子进程

             delete_init_action(a);  //在init_action_list链表内删除

           while (1) {

              run_actions(RESPAWN);

                 if (a->pid == 0) {
                     a->pid = run(a);
                   }

              run_actions(ASKFIRST);

                if (a->pid == 0) {
                     a->pid = run(a);

                         打印\nPlease press Enter to activate this console.

                         等待回车

                         创建子进程
                   }

                  

               wpid = wait(NULL);    //等待子进程退出

               while (wpid > 0) {

                  a->pid = 0;      //退出后,就设置pid=0

              }

           }

                 

配置文件:

a、指定程序

b、何时执行

从默认的new_init_action反推出默认的配置文件

#inittab格式:

#<id>:<runlevels>:<action>:<process>

#id =》 /dev/id 用作终端: stdin ,stdout,stderr:printf,scanf,err

#runlevels:忽略

#action:执行时机

# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
#                                  restart, ctrlaltdel, and shutdown.

#process:脚本或应用程序

::CTRLALTDEL:reboot::SHUTDOWN:umount -a -r::RESTART:init::ASKFIRST;-/bin/shtty2::ASKFIRST;-/bin/shtty3::ASKFIRST;-/bin/shtty4::ASKFIRST;-/bin/sh::SYSINIT:/etc/init.d/rcS

    /* Reboot on Ctrl-Alt-Del */new_init_action(CTRLALTDEL, "reboot", "");/* Umount all filesystems on halt/reboot */new_init_action(SHUTDOWN, "umount -a -r", "");/* Swapoff on halt/reboot 资源不够时将应用程序调到硬盘上*/if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");/* Prepare to restart init when a HUP is received */new_init_action(RESTART, "init", "");/* Askfirst shell on tty1-4 */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);/* sysinit */new_init_action(SYSINIT, INIT_SCRIPT, "");

 new_init_action(ASKFIRST, bb_default_login_shell, VC_2);#define LIBBB_DEFAULT_LOGIN_SHELL      "-/bin/sh"# define VC_2 "/dev/tty2"

 new_init_action(ASKFIRST, -/bin/sh, /dev/tty2);

struct init_action {struct init_action *next;int action; pid_t pid; char command[INIT_BUFFS_SIZE]; char terminal[CONSOLE_NAME_SIZE]; };

static void new_init_action(int action, const char *command, const char *cons)
{struct init_action *new_action, *a, *last;if (strcmp(cons, bb_dev_null) == 0 && (action & ASKFIRST))return;/* Append to the end of the list */for (a = last = init_action_list; a; a = a->next) {/* don't enter action if it's already in the list,* but do overwrite existing actions 已存在则覆盖,否者新建*/if ((strcmp(a->command, command) == 0)&& (strcmp(a->terminal, cons) == 0)) {a->action = action;return; }last = a;}new_action = xzalloc(sizeof(struct init_action));if (last) {last->next = new_action;} else {init_action_list = new_action;}strcpy(new_action->command, command);new_action->action = action;strcpy(new_action->terminal, cons);messageD(L_LOG | L_CONSOLE, "command='%s' action=%d tty='%s'\n",new_action->command, new_action->action, new_action->terminal);

new_init_action(int action, const char *command, const char *cons)

最小根文件系统需要

1、/dev/console      /dev/null      //如果没有设置标准输出则定位到这

2、init本身即busybox

3、/ect/inittab

4、配置文件里指定的应用程序

5、库

转载于:https://www.cnblogs.com/CZM-/p/5078011.html

构建根文件系统启动(1)相关推荐

  1. 从ramdisk根文件系统启动Linux

    今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fed ...

  2. Ubuntu环境搭建支持设备树,内核和根文件系统启动

    Ubuntu环境搭建支持设备树,内核和根文件系统启动 使用tftp获取设备树和内核文件 1.搭建TFTP服务器 sudo apt-get install tftp-hpa tftpd-hpa sudo ...

  3. 菜鸟笔记--debian根文件系统启动时[FAILED] Failed to start Create Volatile Files and Directories.

    今天移植debian的根文件系统到开发板上,根文件系统启动时一堆红色报警,很扎眼. [FAILED] Failed to start Create Volatile Files and Directo ...

  4. TQ2416通过nfs挂载根文件系统启动

    1.Ubuntu12.04搭建nfs服务器: 简要流程如下: 1). sudo /etc/init.d/portmap restart sudo /etc/init.d/nfs-kernel-serv ...

  5. Linux内核3.0移植并基于Initramfs根文件系统启动

    Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...

  6. linux 内核 ramdisk,Ramdisk根文件系统启动Linux(单独的ramdisk镜像)

    [size=13.63636302947998px]具体步骤如下: 1.解压内核源码树 解压kernel.tar.gz2到自己的工作目录,其他的开发板就自己找相应的kernel,或者自已移植. [si ...

  7. linux根文件系统配置,嵌入式Linux的Cramfs根文件系统配置的解决方案

    1 引言 随着电子产业的不断发展,基于 ARM 技术的系统设计和开发平台越来越多地在控制 类.消费类.通信类等电子产品中广泛应用.从软件角度上看,构建基于ARM 技术的linux 系统要涉及到引导加载 ...

  8. 嵌入式Linux 的Cramfs 根文件系统配置成可读可写

    嵌入式Linux 的Cramfs 根文件系统配置成可读可写  1.概述 从软件角度上看,构建基于ARM技术的linux系统要涉及到引导加载程序.Linux内核.文件系统.用户应用程序几部分的设计.文件 ...

  9. linux 文件系统 启动,linux kernel文件系统启动部分

    现在的kernel里,有个叫做ramfs的文件系统,会把initrd(或者ramdisk,为惯性叫法)里的东西挂载到early-rootfs里(即rootfs,是ramfs的一个特殊实例),执行一些在 ...

最新文章

  1. 图论 ---- C. Graph Transpositions(数据分阶段分层图最短路(二维) + 贪心)
  2. Java开发中Websocket的技术选型参考
  3. Android Git 客户端
  4. iOS基础知识点总结
  5. SQL SERVER2000存储过程调试
  6. php 注册自动登录,php – 创建第二个自动登录用户的登录页面
  7. Python中abs()和fabs()方法之间的区别
  8. dubbo-admin管理平台搭建
  9. go语言学习初探(二)基础语法
  10. 将pdf书籍变成横排的方法
  11. STM32H7---高速缓存Cache(一)
  12. idea 填充变量类型_填充IntelliJ IDEA项目
  13. 为什么使用交叉熵代替二次代价函数_Softmax回归与交叉熵损失的理解
  14. laravel 5连接MySQL_Laravel 手记(连接mysql)
  15. Replace Record with Data Class
  16. MacBook安装telnet工具和使用
  17. 地产公司新建商业中心调研-调研内容
  18. cad里面f命令用不了_cad命令_CAD命令中 F 命令是什么作用?
  19. SiamRPN++理解
  20. 服务器配置ipv6网站,服务器配置ipv6地址

热门文章

  1. HDU 2660 Accepted Necklace
  2. 在VMware ESX Server使用华为存储
  3. 中国汽车涂料发展的初期
  4. html json 访问工程,SpringBoot:Web项目中如何优雅的同时处理Json和Html请求的异常...
  5. redis集合数据过期_如何从Redis中的集合中自动删除过期的密钥?
  6. Python爬虫框架Scrapy学习笔记
  7. Java开发四年的程序员想再学习一门语言,该选着C还是Python呢?
  8. android 中自定义安装,AndroidStudio 自定义配置
  9. 语言准备客票问题_菲律宾出国留学需要准备什么?
  10. python中类的定义方法_python中类的定义方法