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函数中。

转载于:https://www.cnblogs.com/-glb/p/7082229.html

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

  1. 构建根文件系统之启动第1个程序init

    目录 打开标准输入/输出/错误 执行init进程 小结测试 init实现 总结 引入 在Kernel源码分析中,了解到init_post是在挂载根文件系统之后执行应用程序 打开标准输入/输出/错误 L ...

  2. 构建根文件系统(一)

    接着前边内核移植的文章,记录根文件系统的构建. 这里要用到强大的busybox,我选择的版本是busybox-1.18.5.tar.bz2 ,1.17的也可以:之所以选择这个版本是因为基于现在的交叉编 ...

  3. 野火i.MX6ULL Pro开发板构建根文件系统

    眼瞅着2020年马上就要到头了,承诺给大家的Linux移植三部曲还差最后一篇,这个拖延癌晚期恐怕今年是治不好了,不到最后的DL绝不妥协-- (这句话是年前写的,写了个开头就疫情了,封城,电脑丢在了公司 ...

  4. 基于ubuntu-base构建根文件系统并移植到RK3568开发板

    目录 前言 一.根文件系统是什么? 二.构建根文件系统的方法 1.debootstrap 2.builroot 3.busybox 4.ubuntu-base 三.进入主题--如何使用ubuntu-b ...

  5. buildroot构建根文件系统

    buildroot构建根文件系统 一.简介 Buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfig配置文件构成的.本文使 ...

  6. Buildroot 构建根文件系统(Jz2440)

    1. Buildroot 简介      Buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfig配置文件构成的.你可以和 ...

  7. 【ARM】使用Busybox构建根文件系统

    Busybox构建根文件系统 介绍 下载 配置busybox 配置交叉编译器 取消静态库编译 添加vi命令的支持 取消简化模块 支持mdev 中文支持 编译 完善根文件系统 创建必要文件夹 复制库 启 ...

  8. 韦东山uboot_内核_根文件系统学习笔记4.4-第004课_根文件系统-第004节_构建根文件系统之构建根文件系统

    一 最小的根文件系统需要的项(笔记4.1 4.2小结) (init 进程需要) 打开终端: /dev/console, /dev/NULL 不设置 inittab 格式中的 id(标准输入.输出和标准 ...

  9. 从零开始构建根文件系统

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 Uboot和系统移植(19)------- 根文件系统构建过程详解_big__C的博客-CSDN博客 一.总结 (1)本节在前面的理论 ...

  10. 嵌入式中利用ubuntu-base构建根文件系统

    在嵌入式环境中,我们最常用busybox.yocto或buildroot来构建根文件系统,这种情况下,当我们需要使用一些组件的时候,往往需要我们使用源码编译,移植到开发板中.那有没有像ubuntu的文 ...

最新文章

  1. model存数据_Jepsen 测试框架在图数据库 Nebula Graph 中的实践
  2. BZOJ3993: [SDOI2015]星际战争
  3. php 安装redis php扩展
  4. 好程序员Web前端分享无法忽视的JavaScript技巧
  5. linux制作openssl rpm,CentOS 7 定制 OpenSSL RPM 包
  6. win10虚拟内存怎么设置最好_淘宝直通车时间段怎么设置?哪个时间段开最好?...
  7. Kali linux学习入门-安装Kali Linux 后需要做的 20 件事
  8. Python多线程和多进程编程
  9. 百度被告监听用户,回应“没那能力”,但小米说锅就是你的!
  10. openssl搭建私有CA
  11. 开发服务器 安装 centos 8 无法进入图形安装界面 X startup failed falling back to text mode
  12. android查看cpu型号_笔记本电脑cpu处理器怎么看?
  13. Dz插件-Discuz插件-免费Discuz采集伪原创发布插件
  14. 普元的ajax,普元EOS平台介绍
  15. 学校多媒体讲台计算机怎么开,学校教室多媒体使用说明.PPT
  16. WTEditor(windows窗口标题栏文字修改工具)绿色单文件版V1.0 | windows窗口标题文字怎么修改?
  17. [swift] UIImage NSImage PNG透明区域填充自定义颜色实现
  18. 楼宇报警器 java程序_智能楼宇防盗报警系统
  19. 自定义Tab切换+自定义CheckBox+light7无限滑动/下拉刷新
  20. MXL90614红外线测温传感器

热门文章

  1. 程序猿的爱情--2011-12-27
  2. vscode-更换图标主题VSCode Icons.
  3. 虚拟机开机时出现Press ESC in 5 seconds to skip startup.nsh, any other key to continue问题的解决办法
  4. Java基础IO流(案例源码)【六】
  5. 用python画明星_Python也能成为毕加索?我用Python给小姐姐画了幅油画
  6. vmWare配置静态ip-net模式
  7. python读取图片转cvs_python将图片转换为csv
  8. 飞信机器人 ld-linux.so.2,基于linux的飞信机器人2010版安装
  9. yum在linux安装mysql数据库_linux安装mysql(yum安装,比较简单)
  10. dategridview代码选中行_使用IntelliJ IDEA进行Java代码调试的技巧