一、Bootloader 简介
1、系统上电之后,需要一段程序来进行初始化:关闭WATCHDOG、改变系统时钟、初始化存储控制寄存器、将更多的代码复制到内存中等。如果它能将操作系统内核复制到内存中运行,无论从本地(比如Flash)还是从远端(比如通过网络),就称这段程序为Bootloader 。
简单的说,Bootloader 就是这么一段小程序,它在系统上电时开始执行,初始化硬件设备、准备好软件环境,最后调用操作系统内核。
2、Bootloader 的启动方式
CPU 上电后,会从某个地址开始执行。比如MIPS 结构的CPU 会从0xBFC00000取第一条指令,而ARM 结构的CPU则从地址 0x0000000 开始。嵌入式开发板中,需要把存储器件ROM或Flash 等映射到这个地址,Bootloader 就存放在这个地址开始处,这样以上电就可以执行。
Bootloader 的两种操作模式
a、启动加载模式:上电后Bootloader 将操作系统加载到RAM中,整个过程无用户介入。
b、下载模式:在这种模式下,开发人员可以使用各种命令,通过串口连接或者网络连接等通讯手段从主机下载文件(比如内核映象、文件系统映象),将它们直接放在内存运行或者烧入Flash 类固态存储设备中。
二、Bootloader 的结构和启动过程
1、嵌入式Linux 系统从软件的角度通常可以分为以下4 个层次。
a、引导加载程序,包括固化在固件中的boot 代码(可选)和Bootloader 两大部分。
有些CPU 在运行Bootloader 之前先运行一段固化程序,比如x86 结构的CPU 就是先运行BIOS 中的固件,然后才运行硬盘第一个分区中的Bootloader。在大多嵌入式系统中并没有固件,Bootloader 是上电后执行的第一个程序。
b、Linux 内核。
特定于嵌入式板子的定制内核以及内核的启动参数。内核的启动参数可以是内核默认的,或者是由Bootloader 传递给它的。
c、文件系统。
包括根文件系统和建立与Flash 内存设备之上的文件系统。里面包含了Linux 系统能够运行所必须的应用程序、库等,比如shell 程序, 动态链接的程序运行时需要的glibc 或uClibc 库等。
d、用户应用程序
特定于用户的应用程序,它们也存储在文件系统中。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有: Qtopia 和 MiniGUI 等。
典型分区结构:
”Boot parameters“ 分区中存放一些可设置的参数,比如IP地址、串口波特率、要传递给内核的命令行参数等。
Bootloader 首先运行,然后它将内核复制到内存中(也有些内核可以在固态存储设备上直接运行),并在内存某个固定的地址设置好要传递给内存的参数,最后运行内核。内核启动后,它会挂载根文件系统,启动文件系统中的应用程序。
2、Bootloader 的两个阶段
Bootloader 的启动过程可以分为单阶段、多阶段两种。通常多阶段的Bootloader 能提供更加复杂的功能以及更好的移植性。
Bootloader 大多都是两阶段的启动过程:
第一阶段:汇编语言实现,它完成一些依赖于CPU 体系结构的初始化,并调用第二阶段的代码;
第二阶段:通常用 C 语言实现。
具体如下:
(1)Bootloader 第一阶段的功能
a、硬件设备初始化;(包括关闭WATCHDOG、关中断、设置CPU 的速度和时钟频率、RAM 初始化等)
b、为加载 Bootloader 的第二阶段代码准备RAM 空间;
c、复制 Bootloader 的第二阶段代码到RAM 空间中;
d、设置好栈;
e、跳转到第二阶段代码的C入口点。
(2)Bootloader 第二阶段的功能
a、初始化本阶段要使用到的硬件设备;
b、检测系统内存映射;
c、将内核映象和根文件系统映象从Flash 上读到RAM 空间中;
d、为内核设置启动参数;
e、调用内核。
将内核存放在适当的位置后,直接跳到它的入口点即可调用内核。调用内核之前,下列条件要满足。
(3)Bootloader 与内核的交互
Bootloader 与内核 的交互式单向的,Bootloader 将各类参数传给内核。由于它们不能同时运行,传递办法只有一个: Bootloader 将参数放在某个约定的地方之后,再启动内核,内核启动后从这个地方获得参数。
除约定好参数存放地址外,还要规定参数的结构。(标记的数据结构)
三、常用的 Bootloader 介绍
开放源码的Linux 引导程序
Vivi 是 Mizi 公司针对 Samsung 的ARM 架构 CPU 专门设计的,基本上可以直接使用,命令简单方便。不过其初始版本只支持串口下载,速度较慢。
U-Boot 支持大多CPU,可以烧写EXT2、JFFS2文件系统映象,支持串口下载、网络下载,并提供了大量的命令。相对于Vivi ,它的使用更复杂,但是可以用来更方便的调试程序。
上一篇:ADS 1.2 在WIN7 64 下——编译测试程序出错的问题
下一篇:TQ2440 学习笔记—— 29、移植U-Boot【U-Boot 的编译、链接过程】
推荐阅读最新更新时间:2024-11-16 22:21
设计资源 培训 开发板 精华推荐
- inDART-HCS08D: In-Circuit, Real-Time Debugger/Programmer for NXP S08 Family
- LTC3122EDE 演示板、高效 15V 2.5A 同步升压转换器
- 【低创】【20201120更新】TMC2226
- 使用 MaxLinear, Inc 的 SPX29303U 的参考设计
- LTC2151IUJ-12 单通道、12 位、210Msps ADC 的典型应用电路
- 虚假的分体键盘(正交)
- 使用 L6566BH 多模控制器的 40 W 宽输入范围反激式转换器用于 SMPS
- LTC4444-5 的典型应用 - 高压同步 N 沟道 MOSFET 驱动器
- 使用 PIC16C924 MCU 的 PICREF-3 瓦时计参考设计
- 使用8位Nand Flash的应用电路:Nand512W3A2C/Nand512W3A2B连接STM32F10xxx
- Follow me第3期来袭,与得捷一起解锁Seeed Studio XIAO ESP32C3!
- 【泰克注册观看有礼】 PCI-SIG 前主席解析:PCI Express5.0测试方案和测量挑战
- 『ADI实验室电路DIY大赛』正式启动!
- 有奖报名|TI MSPM0 在【电力输送和工厂自动化与控制系统】、【家用电器和电机控制】中的典型应用
- 下载资料有好礼:超凡富士通存储器FRAM,安全、易写入、低功耗
- ADI 连续无创式血压解决方案
- USB Tybe-C 知识大考问
- 邀你参加:EEWORLD&ST 智能产品线下研讨会(12月6日-深圳)
- 停工停课不停学!罗姆R课堂正式上线
- 开学季!解锁奇楼去充电,玩转幸运大抽奖~抽不中再抽