一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader), Linux 内核,文件系统,应用程序。

当系统首次引导时,或系统被重置时,处理器会执行一个位于Flash/ROM中的已知位置处的代码,Bootloader就是这第一段代码。它主要用来初始化处理器及外设,然后调用 Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统作为根文件系统(Root Filesystem),然后加载必要的内核模块,启动应用程序。这就是嵌入式Linux系统启动过程 Linux 引导的整个过程。

根文件系统是 Linux 系统的核心组成部分,它可以作为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。

从以上分析可以看出 Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动 Linux 内核,让我们进一步分析 Bootloader 和 Linux 内核在嵌入式系统中的关系和作用。

一、Bootloader

1、Bootloader基本概述

Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于 PC 机上的 BIOS。Bootloader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的Bootloader是很困难的,但为了能达到启动Linux 内核的目的,所有的 Bootloader都必须具备以下功能:

1) 初始化 RAM

因为 Linux 内核一般都会在 RAM 中运行,所以在调用 Linux 内核之前 Bootloader 必须设置和初始化 RAM,为调用 Linux内核做好准备。初始化 RAM 的任务包括设置 CPU 的控制寄存器参数,以便能正常使用 RAM 以及检测RAM 大小等。

2) 初始化串口端口

在 Linux 的启动过程中有着非常重要的作用,它是 Linux内核和用户交互的方式之一。Linux 在启动过程中可以将信息通过串口输出,这样便可清楚的了解 Linux 的启动过程。虽然它并不是 Bootloader 必须要完成的工作,但是通过串口输出信息是调试 Bootloader 和Linux 内核的强有力的工具,所以一般的 Bootloader 都会在执行过程中初始化一个串口作为调试端口。

3) 检测处理器类型

Bootloader在调用 Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给 Linux 内核。Linux 内核在启动过程中会根据该处理器类型调用相应的初始化程序。

4) 设置 Linux启动参数

Bootloader在执行过程中必须设置和初始化 Linux 的内核启动参数。

5) 调用 Linux内核映像

Bootloader完成的最后一项工作便是调用 Linux内核。如果 Linux 内核存放在 Flash 中,并且可直接在上面运行(这里的 Flash 指 Nor Flash),那么可直接跳转到内核中去执行。但由于在 Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将 Linux内核拷贝到 RAM 中,然后跳转到 RAM 中去执行。

2、Bootloader启动过程

嵌入式Linux系统通过Bootloader引导,一上电,就要执行Bootloader来初始化系统。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是 Flash或 DOC 等)中的Linux 内核拷贝到 RAM 中去,然后跳转到内核的第一条指令处继续执行,从而启动 Linux 内核。Bootloader 和 Linux 内核有着密不可分的联系。

Bootloader多数有两个阶段的启动过程:

Stage1:

基本的硬件初始化
为加载stage2准备RAM空间
拷贝内核映像和文件系统映像到RAM中
设置堆栈指针sp
 跳到stage2的入口点

Stage2:

初始化本阶段要使用到的硬件设备
 检测系统的内存映射
加载内核映像和文件系统映像
设置内核的启动参数
嵌入式系统中广泛采用的非易失性存储器通常是 Flash,而 Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是 Bootloader。Bootloader在flash中的存储示意图如下:

3、Bootloader 的启动方式

3.1 网络启动方式

这种方式的开发板不需要较大的存储介质,跟无盘工作站有点类似,但是使用这种启动方式之前,需要把Bootloader安装到板上的EPROM或者Flash中。Bootloader通过以太网接口远程下载Linux内核映像或者文件系统。Bootloader下载文件一般都使用TFTP网络协议,还可以通过DHCP的方式动态配置IP地址。

3.2 硬盘启动方式

传统的Linux系统运行在台式机或者服务器上,这些计算机一般都使用BIOS引导,并使用磁盘作为存储介质。Linux传统上是LILO (Linux Loader) 引导,后来又出现了GUN的软件 (Grand Unified Bootloader) 。 这两种Bootloader广泛应用在X86的Linux系统上。

3.3 Flash启动方式

大多数嵌入式系统上都使用Flash存储介质。Flash有很多类型,包括NOR Flash、NAND Flash和其它半导体盘。它们之间的不同在于: NOR Flash 支持芯片内执行(XIP, eXecute In Place),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而NAND Flash并不支持XIP,所以要想执行 NAND Flash 上的代码,必须先将其拷贝到 RAM中去,然后跳到 RAM 中去执行。NOR Flash 使用最为普遍。Bootloader一般放在Flash的底端或者顶端,这需要根据处理器的复位向量来进行设置。可以配置成MTD设备来访问Flash分区。

4、Bootloader种类

嵌入式Linux系统已经有各种各样的Bootloader,种类划分的方法也不是唯一的,一般可以按照它所支持处理器体系结构不同进行划分,如下表:

常见嵌入式Linux的Bootloader有:Blob、Redboot、U-Boot

二、Linux内核的启动过程

Linux 内核有两种映像:一种是非压缩内核,叫 Image,另一种是它的压缩版本,叫zImage。根据内核映像的不同,Linux 内核的启动在开始阶段也有所不同。ZImage 是 Image经过压缩形成的,所以它的大小比 Image 小。但为了能使用 zImage,必须在它的开头加上解压缩的代码,将 ZImage 解压缩之后才能执行,因此它的执行速度比 Image 要慢。但考虑到嵌入式系统的存储空容量一般比较小,采用 zImage 可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的。所以一般的嵌入式系统均采用压缩内核的方式。

在 Bootloader将 Linux 内核映像拷贝到 RAM 以后,解压内核映像和初始化,完成剩余的与硬件平台相关的初始化工作,再进行一系列与内核相关的初始化后,调用第一个用户进程-init 进程并等待用户进程的执行,这样整个 Linux 内核便启动完毕。在很多情况下,我们可以调用一个简单的 shell 脚本来启动必需的嵌入式应用程序。

三、常见嵌入式Linux系统架构

1、nor(uboot)+nand(固件+存储)+内存

2、nor(uboot)+emmc(固件+存储)+内存

3、emmc(uboot+固件+存储)+内存  ---- 需要硬件支持从emmc启动uboot

4、nor(uboot+固件+存储)+内存  ---- 适用于应用程序和存储量较小的场景

嵌入式Linux系统启动过程相关推荐

  1. linux系统启动过程(三)

    Linux 系统启动过程 linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 ...

  2. 【Notes9】Linux系统启动过程,数据库,驱动,i2c-tools,shell

    文章目录 1.Linux系统启动过程:ukr,ubuntu开机引导文件/etc/default/grub 2.数据库:存储过程(PL/SQL代码集,像没有返回值的自定义函数)和函数需要用户显示调用才执 ...

  3. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  4. Linux 系统启动过程

    简介 Linux 系统启动过程大致分为5个阶段: 1.内核的引导 2.运行 init. 3.系统初始化 4.建立终端 5.用户登录系统 内核引导 计算机通电后,首先会进行 BIOS 开机自检,然后根据 ...

  5. linux efi 启动原理,Linux系统启动过程

    了解Linux系统的启动过程有助于我们深入理解Linux系统运行原理,下面我们将介绍一些系统启动过程中一些重要的细节.在这里,我们将Linux系统启动过程分成7个步骤介绍,这个过程如下图所示. 1.启 ...

  6. Linux运维系列总结-Linux系统启动过程、WEB工作原理、DHCP工作原理、DNS解析原理、NFS网络文件系统、FTP文件传输协议、PXE+KICKSTART自动安装系统

    Linux运维系列总结-Linux系统启动过程.WEB工作原理.DHCP工作原理.DNS解析原理.NFS网络文件系统.FTP文件传输协议.PXE+KICKSTART自动安装系统 1.Linux系统的启 ...

  7. linux系统的启动过程 5个步骤,第5章 Linux系统启动过程.ppt

    <第5章 Linux系统启动过程.ppt>由会员分享,可在线阅读,更多相关<第5章 Linux系统启动过程.ppt(26页珍藏版)>请在人人文库网上搜索. 1.第5章 Linu ...

  8. Linux系统启动过程

    Linux系统启动过程 从启动电源到BIOS 关于BIOS 1. BIOS 是什么 2. BIOS 存储的信息 3. BIOS 需要在内存中加载中断向量表和中断服务程序 一.启动BIOS ,准备实模式 ...

  9. 剖析Linux系统启动过程

    http://www.5dmail.net/html/2004-11-29/20041129102711.htm 内容提要 本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现 ...

最新文章

  1. aspose.cells 无法读取公式值_隐藏 Excel表格、公式的9种方法
  2. 导出txt文件宏_XLM宏反混淆工具:提取和反混淆XLM宏
  3. (转)安装黑苹果 MAC OS X Lion 10.7.2过程 (未验证)
  4. MVC4验证用户登录特性实现方法
  5. el-table 树形表格 自定义展开图标_实践一个树形组件
  6. 3d激光雷达开发(icp匹配)
  7. feignClient的使用
  8. [ioi2008]Island 岛屿
  9. 使用当前更改创建Git分支
  10. 怎么用python扫描主机_python 扫描内网存活主机
  11. js在wap端获取定位_两款JS脚本判断手机浏览器类型跳转WAP手机网站
  12. html和css实现 字体变色 旋转 图标渐变
  13. jike2021总结
  14. 领导与管理的区别与联系
  15. css3 实现盒子四周光晕_使用CSS3做出带有光晕流星旋转光环的效果 -
  16. 解决Macbook互联网不能共享 因为它是受802.1X保户问题
  17. java signal信号_Java Signal实例
  18. linux下c使用lzma_使用 LZMA SDK
  19. 计算机中考在线评分卡,提前了解中考电脑阅卷流程,看完绝对提分,附备考建议...
  20. 微信小程序设置启动页面

热门文章

  1. 打开excel表格提示内存不足
  2. 如何在黑客马拉松中生存
  3. 数字电路-半导体存储电路
  4. 一款简单易上手的ARM单片机开发IDE—STduino
  5. Da Vinci: 一种微创手术机器人
  6. [设计] Doris血缘解析流程
  7. 供暖水力计算_利用邻居的计算能力为您的房屋供暖
  8. 利用MS08067远程溢出漏洞抓肉鸡
  9. SQLyog图形化l数据库的操作和学习
  10. Java个人日记_个人的JAVA学习小日记