构建根文件系统启动(1)

                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、库

时间: 2024-09-30 10:21:45

构建根文件系统启动(1)的相关文章

构建根文件系统启动(2)

配置编译busybox make menuconfig [*]   Tab completion mkdir -p /work/nfs_root/frist_fs make make  CONFIG_PREFIX=/work/nfs_root/frist_fs install bin  linuxrc  sbin  usr[email protected] sktop:/work/nfs_root/frist_fs$ ls -ltotal 12drwxr-xr-x 2 book book 409

从ramdisk根文件系统启动Linux 二

今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下.其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆). 开发环境:Fedora 9交叉编译工具链:arm-linux-gcc 4.3.2 with EABI嵌入式Linux内核版本:2.6.29.4-FriendlyARM.昨天写贴子的时候具体记不清了,今天起来启动开发板用uname -r查一下,就是叫做2.6.29.4-FriendlyARM,帖子已经改好了.本文就是友

从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆).开发环境:Fedora 9交叉编译工具链:arm-linux-gcc 4.3.2 with EABI嵌入式Linux内核版本:2.6.29.4-FriendlyARM.昨天写贴子的时候具体记不清了,今天起来启动开发板用uname -r查一下,就是

从ramdisk根文件系统启动Linux成功

这几天参考国嵌的实验手册和网上的资料完成了u-boot定制.内核定制.ramdisk根文件系统的制作,并成功.趁热打铁,总结一下.本文引用了很多网络上的文章,就不一一注明了.感谢各大侠的帮助,如有雷同,望见谅. 开发环境:红帽企业版5 交叉编译工具链:arm-linux-gcc4.3.2 嵌入式Linux内核版本:友善之臂的mini2440开发板光盘自带的内核linux-2.6.32.2 开发板:mini2440-64MNand Flash Bootloader:u-boot-1.20 具体步骤

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

Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先,磨刀不误砍柴工.在动手进行linux内核移植之前,我们有必要对linux内核进行一定的了解. 1.1 Linux内核启动过程概述 一个嵌入式Linux系统从软件角度看可以分为四个部分:  引导加载程序(Bootloader),Linux内核,文件系统,应用程序. 其中Bootloader是系统启动或

busybox构建根文件系统

busybox是一个复合了大量简易版linux工具的程序,嵌入式系统中使用它可以快速建立一个相对简易的根文件系统.1.下载busybox官网 www.busybox.net目前(2015.8.4)的最新稳定版为1.23.22.编译busybox编译busybox前,请安装好交叉工具链,比如我这里是omapl138的工具链,安装位置/opt/arm-linux-gcc/omapl138/bin/,因为编译器前缀和另外一个编译器的相同,每次使用前设置环境变量 PATH=$PATH:/opt/arm-

构建根文件系统之根文件系统

在构建根文件系统之busybox中,我们已经实现了配置,编译,安装busybox.即那个init程序的来源. 首先在pc看一下,/dev/console  和/dev/null的具体信息: 执行ls /dev/console  /dev/null crw------- 1 root root 5, 1 6月 27 08:06 /dev/console   //字符设备 ,主设备号为5,次设备号为1crw-rw-rw- 1 root root 1, 3 6月 27 08:06 /dev/null

Linux根文件系统分析之init和busybox

Hi,大家好!我是CrazyCatJack.今天给大家讲解Linux根文件系统的init进程和busybox的配置及编译. 先简单介绍一下,作为一个嵌入式系统,要想在硬件上正常使用的话.它的软件组成大概有这三部分:1)bootloader  2)嵌入式系统kernel  3)根文件系统 .这其实非常好理解,类比于PC上的操作系统,首先我们需要类似BIOS的东东,来控制系统的启动项,决定从哪里启动,怎样启动,启动什么.在嵌入式系统里bootloader就起着这样的作用.再者,我们需要一个已经配置.

Linux系统根文件以及命名规则详解

一.Linux系统根文件详解 Linux的重要哲学思想其实就是:将程序的配置文件保存为纯文本格式. 1./boot:系统启动文件,如:内核文件,iniyrd以及gurb(bootloarder) 2./dev:目录下为设备文件,设备文件又分为块设备和字符设备: 块设备:按数据块随机访问,没有顺序. 字符设备:线性访问,按字符为单位进行. 注:其中背景为黑色,字体为***的文件,为特殊文件,"1,   0"分别为文件的主设备号和次设备号 [[email protected] ~]# ls