构建根文件系统之启动第一个程序(韦大仙)

u-boot的目的:启动内核

内核的目的:启动应用程序,而应用程序位于根文件系统上面。因此,需要构建根文件系统。

只需完成以上几步,就可以在单板上搭建出一个linux系统来。

问题:有那么多应用程序,内核启动后首相打开哪一个?

内核启动的时候,挂接好根文件系统之后,执行应用程序在init_post函数中。

static int noinline init_post(void)
{

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

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

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

}

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

(1)open(‘/dev/console")尝试打开/dev/console设备文件,如果成功,它就是init进程标准输入设备。

    sys_dup(0);将文件描述符0复制给文件描述符1
    sys_dup(0);将文件描述符复制给文件描述符2

从而,标准输入、标准输出、标准错误都对应一个文件(设备)。

打开标准输入、标准输出、标准错误设备

linux中最先打开的三个文件分别称为标准输入(stdin)、标准输出(stdout)、标准错误(stderr)。它们对应的文件描述符分别为0、1、2.所谓标准输入就是在程序中使用scanf()、fscanf(stdin,...),从哪个文件(设备)读取文件;标准输出、标准错误都是输出设备,前者对应printf()、fprintf(stdout,...),后者对应fprintf(stderr,...)

/dev/console对应的东东就终端。

(2)如果ramdisk_execute_command变量指定了要运行的程序,启动它。

  ramdisk_execute_command的取值分为三种情况:

  a.如果命令行参数中指定了“rdinit=...”,则ramdisk_execute_command等于这个参数指定的程序。

  b.否则,如果/init程序存在,ramdisk_execute_command就等于/init

  c.否则,ramdisk_execute_command为空

  韦老师书中所用的命令没有设定“rdinit=...”,根文件系统中也没有"/init"。所以ramdisk_execute_command为空。if下的那块程序不会执行。

  

(3)如果定义了execute_command,那么就会执行run_init_process(execute_command);从而启动execute_command这个应用程序。否则向下运行。

  如果命令行中指定了"init=...",则execute_command等于这个参数指定的程序,否则为空。同样没有指定。

(4)依次尝试执行/sbin/init、/etc/init、/bin/init、/bin/sh

  在根文件系统中,/sbin/init是存在的,因此执行/sbin/init程序。所以init进程所用的程序就是/sbin/init。从此系统的控制权交给/sbin/init,不再返回init_post函数中。

时间: 2024-08-03 23:49:12

构建根文件系统之启动第一个程序(韦大仙)的相关文章

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

在构建根文件系统之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

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构建根文件系统和制作Ramdisk

定制根文件系统的方法很多,最常用的是使用BusyBox来构建定制根文件系统.它集成压缩了Linux的许多工具和命令,可以使用户迅速方便地建立一套相对完整.功能丰富的文件系统,其中包括大量常用的应用程序.下面详细介绍有关Busybox定制根文件系统. 一.系统环境: 1.操作系统:Ubuntu140.4 2.交叉编译工具:gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08) 3.busybox源码包:busybox-1.26.2 二.构建rootf

构建根文件系统之init进程分析

busybox是ls.cp等命令的集合. 执行ls时,实际上是执行了busybox ls 执行cp时,实际上是执行了busybox cp 分析init程序之前,再让我们回想一下我们的目标:u-boot启动内核,内核启动应用程序,内核是怎样启动应用程序呢,内核启动了init进程,位于/sbin/init中.我们最终的目的是启动客户程序,也就是说假如你是做手机的,希望启动一个手机的程序,假如是做监控的,那么就启动一个监控的程序的.客户各有不同,但都使用了linux系统,那么怎样加以区分呢? init

使用busybox构建根文件系统

当我们在Qemu上运行起来自己编译的内核之后,需要使用busybox构建一个文件系统,将此文件系统挂载上去就可以使用busybox提供的各种命令了. 1.编译安装busybox 源码下载地址:http://www.busybox.net/downloads/ 编译安装过程: tar jxvf busybox-1.23.1.tar.bz2 cd busybox-1.23.1 make menuconfig 选择静态编译 BusyboxSettings->Build options->Build

韦东山笔记之用busybox构建根文件系统

1 百度搜索busybox进入busybox官网(https://busybox.net/)  点击左侧DownloadSource下载最新稳定版的busybox-1.24.2.tar.bz2  2 将其复制到服务器并解压缩 tar xjf busybox-1.24.2.tar.bz2 3进入根目录,在其根目录下有一个INSTALL文件告诉我们怎么使用busybox make menuconfig 什么都不设置,但要保存设置.然后执行下列指令更改CROSS_COMPILE ?=arm-linux

《构建根文件系统(二)分析busybox源码》

1.busybox 平时我们在开发板中输入ls.cp.mv等命令,都是在/bin文件中.而通过ls -l就可以发现 这些命令都是放在busybox中的.并且在内核启动后,通过ps命令,可以看到有一个init进程正在运行. 因此就先来分析一下,这个第一个运行的进程init. 2.init进程分析 原文地址:https://www.cnblogs.com/zhuangquan/p/11557781.html

用Busybox构建Linux根文件系统(转载)

注:本文转载自http://blog.sina.com.cn/u/2478597014 用Busybox构建Linux根文件系统 (2015-07-05 14:25:02)   虚拟机:Virtual Box4.2.6 和VMware Workstation6.5.2(这两种虚拟机都成功实作过) 开发环境:Linux版本2.6.32,采用Ubuntu10.04 arm-linux-gcc版本:3.4.1 Busybox版本:1.7.0 开发板:飞凌嵌入式S3C2440 开发板linux内核版本:

第17章- 构建Linux根文件系统

本章目标 l 了解Linux的文件系统层次标准(FHS) l 了解根文件系统下各目录的作用 l 掌握构建根文件系统的方法:移植Busybox.构造各个目录.文件等 l 掌握制作yaffs.jffs2文件系统映象文件的方法 推广: 想了解更多嵌入式知识请移步到 100ask.taobao.com 17.1  Linux文件系统概述 17.1.1  Linux文件系统的特点 类似于Windows下的C.D.E等各个盘,Linux系统也可以将磁盘.Flash等存储设备划分为若干个分区,在不同分区存放不