博客
关于我
嵌入式 Linux 启动流程和 bootloader 介绍
阅读量:653 次
发布时间:2019-03-15

本文共 2531 字,大约阅读时间需要 8 分钟。

目录


入式 Linux 启动流程

简介

对于一个 SoC 芯片而言,bootloader 必不可少。因为一个 SoC 芯片一定不是独立存在的,它的载体是经过严格设计的一块硬件电路板。从电路板上电到 SoC 可以执行 Linux Kernel 并最终挂载文件系统,需要在不同阶段执行不同的特定代码。

SoC 上电伊始,根据设定的启动方式,在合适的地方运行 BootRom 代码,用于对 SoC 做一个最基本最简单的初始化。这是 SoC 执行的第一个程序。

当 SoC 执行完 BootRom 程序后,需要初始化与电路板相关的各种外设等,此时需要一份 Bootloader 来完成此项工作。

当电路板初始化完成后,SoC 可以执行任何的程序,包括加载 Kernel 以及文件系统等。

当然,若 SoC 内部 RAM 足够大同时又不考虑启动的灵活性,则完全可以将 BootRom 做成 bootloader,用于加载 Linux Kernel。

启动流程

一、硬件上电

二、一级启动:bootROM

    Boot ROM 是厂商都无法进行更改,固化在芯片内部的ROM;

    作用:确定用于启动的设备;从启动的设备的位置搬移一小段代码(4k/8k/16k)到RAM中运行,即SPL。

三、二级启动:SPL + uboot

1. SPL: Secondary Program Loader:

    作用:初始化 DDR;从启动的设备搬移第二段代码到 RAM 中,加载 uboot(有些 SoC 是将 bootloader 复制到 RAM 后,再进行 DDR 初始化)。

2. uboot: Universal boot loader:

    U-Boot 从启动设备上面读取、分析环境变量获得 kernel 和 rootfs 存储位置,以及所需的 kernel command line;

    自动检测系统 RAM 和 eMMC/Nand Flash 容量和参数;

    设置以太网口 MAC 地址,并配置好硬件准备加载 Linux kernel;

    加载 Linux kernel 到 RAM,至此系统控制权则转移到 kernel 来处理。

四、Linux Kernel

    系统 Kernel 初始化 Linux,加载 rootfs,最后启动 ’init’ 来初始化 Linux user space

五、不同的OS

    Android、Yocto、ubuntu、fedora

PS:

一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:

1、 引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和 BootLoader 两大部分。(bootROM,uboot)

2、Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。(Linux kernel)

3、 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ramdisk 来作为 rootfs。

4、 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows 和 MiniGUI 等。

BootLoader 是一段小程序,主要功能是引导操作系统启动。可以把它想象成 PC 机 Linux 上的 GRUB/LILO 引导程序,只不过在嵌入式 Linux 中,没有 BIOS,而是直接从 flash 中运行,来装载内核。它可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。

 

Bootloader 简介

由上面的介绍可以知道:Bootloader主要是在系统加载前,初始化硬件设备,建立内存空间的映像图,为最终调用系统内核准备好环境。

市面上可见的 bootloader

开放源码的Linux引导程序

Bootloader 描述 x86 ARM PowerPC
LILO Linux磁盘引导程序
GRUB GNU的LILO替代程序
Loadlin 从DOS引导Linux
ROLO 从ROM引导Linux而不需要BIOS
Etherboot 通过以太网卡启动的Linux系统的固件
LinuxBIOS 完全替代BUIS的Linux引导程序
BLOB LART等的硬件平台的引导程序
U-Boot 通用引导程序
RedBoot 基于eCos的引导程序
vivi 专为ARM处理器系列设计
Bios-lt 专为S3C4510B开发的引导程序
Bootldr 康柏的支持SA1100芯片引导程序

从处理器支持的情况来看,仅 U-Boot 和 RedBoot 对三种架构的处理器都支持,在嵌入式领域比较流行的处理器架构是 ARM 和 PowerPC。RedBoot 的构建必须要基于 eCOS 环境下,这是其一大劣势,对于开发者而言,需要切换环境是一项比较挠头的事情。U-Boot 项目源于 PowerPC,后又兼并了 ARM Boot 项目。这也是为什么 U-Boot 能在 PowerPC 和 ARM 两种架构中得以流行的关键推动因素。

在 Android运行环境中里没有硬盘,而是 ROM,它类似于硬盘存放操作系统,用户程序等。

ROM 跟硬盘一样也会划分为不同的区域,用于放置不同的程序。

android系统分区:

系统分区 功能
/boot 存放引导程序,包括内核和内存操作程序
/system 相当于电脑c盘,存放Android系统及系统应用
/recovery 恢复分区,可以进入该分区进行系统恢复
/data 用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序
/cache 安卓系统缓存区,保存系统最常访问的数据和应用程序
/misc 包含一些杂项内容,如系统设置和系统功能启用禁用设置
/sdcard 用户自己的存储区,可以存放照片,音乐,视频等文件



更多信息可以参考如下链接:

参考:

 

转载地址:http://thdmz.baihongyu.com/

你可能感兴趣的文章
iOS-编译报错duplicate symbol _OBJC_IVAR
查看>>
animation跑马灯动画实现两种方法
查看>>
计时器模仿地球绕太阳圆周运动
查看>>
对曲线的坐标的积分的斯托克斯公式+参数定积分法
查看>>
SAR图像超分辨技术
查看>>
fpga工程师笔试题
查看>>
神经网络遗传算法函数极值寻优-非线性函数极值
查看>>
201604-4 游戏 ccf
查看>>
1144. The Missing Number (20)
查看>>
为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接
查看>>
【Spring Boot 26】分别在SpringBoot和Vue中解决跨域问题
查看>>
Class.forName(),classloader.loadclass用法详解
查看>>
tp5.1 页面错误!请稍后再试~ 安装好后,提示错误
查看>>
阿里云 安全组规则 设置某个IP不能访问服务器(出站)
查看>>
系统打了补丁后,IIS装不了的解决…
查看>>
禁止重复提交(JavaScript控制表单…
查看>>
php js 通过sotitle(id,arr)函数输入ID取得返回值
查看>>
删除外键约束
查看>>
c++ 预处理命令 #error 用法
查看>>
OpenGL fragmentlist片段列表的实例
查看>>