嵌入式基础(四)之BootLoader
专栏地址:嵌入式面经地址
1.什么是BootLoader?⭐⭐⭐
Bootloader(引导加载器)是启动计算机或嵌入式系统时执行的第一个程序,位于固件中。它主要负责初始化系统硬件、加载操作系统,并将控制权转移到操作系统的启动过程。
Bootloader的作用:
- 初始化硬件:Bootloader检查硬件设备,包括处理器、内存、外设等,并进行必要的初始化操作,以确保系统在启动时处于正常工作状态。
- 加载操作系统:Bootloader从存储设备(如硬盘、闪存等)中读取操作系统的引导程序,将其加载到内存中。
- 启动操作系统:一旦操作系统引导程序加载到内存,Bootloader会将控制权转交给引导程序,从而启动操作系统。
- 提供启动选项:有些Bootloader还提供启动选项,允许用户选择不同的操作系统或操作系统的不同启动模式。这对于多系统或双重启动设置很有用。
- 提供固件升级机制:Bootloader还提供固件升级功能,允许系统固件的更新和升级,以支持新的功能、修复漏洞或提高系统性能。
| bootloader作用 | 说明 |
| 硬件初始化 | 检测和初始化计算机或嵌入式系统的硬件设备,如处理器、内存、外部设备等。 |
| 加载操作系统 | 从存储设备中读取操作系统的引导程序,并将其加载到内存中。 |
| 启动操作系统 | 将控制权转移到操作系统的引导程序,以启动操作系统的执行。 |
| 提供启动选项 | 提供用户选择不同操作系统或不同启动模式的选项,支持多系统启动等。 |
| 提供固件升级 | 支持固件的更新和升级,以提供新功能、修复漏洞或提高系统性能。 |
| 处理错误检测 | 在启动过程中检测和处理硬件或软件错误,提供错误消息和故障排除功能。 |
| 支持设备引导 | 支持从不同的存储设备(如硬盘、闪存、网络等)引导操作系统。 |
| 自定义配置 | 允许用户自定义启动配置、参数和引导顺序,以满足特定需求。 |
2.BootLoader的启动的两个阶段?⭐⭐⭐
Stage 1(引导加载器的第一阶段):
- 硬件设备初始化:BootLoader的第一阶段负责初始化计算机或嵌入式系统的硬件设备,包括处理器、内存控制器、外部设备等。
- 为加载Stage 2准备RAM空间:在Stage 1中,BootLoader会为加载Stage 2而准备好内存空间(RAM),通常通过栈(stack)的方式进行分配。
- 加载Stage 2:BootLoader的Stage 1会从预定义的存储设备(例如硬盘、闪存)中读取Stage 2的引导程序,并将其加载到预先分配的内存空间(RAM)中。
- 设置堆栈:BootLoader在加载Stage 2之前会设置好堆栈指针,以确保在后续的执行过程中能正确地进行函数调用和返回操作。
- 跳转到Stage 2的C入口点:在加载完Stage 2之后,BootLoader会将控制权转移到Stage 2的C入口点,即Stage 2中的C语言代码执行的起始位置。
Stage 2(引导加载器的第二阶段):
- 初始化硬件设备:BootLoader的Stage 2进一步初始化硬件设备,例如外部设备(键盘、鼠标、显示器等)和各种总线(如USB、PCI等)。
- 检测内存映像:Stage 2会对系统的内存进行检测,确定可用的内存容量和位置,并为操作系统的加载做好准备。
- 从存储设备读取内核映像和根文件系统映像:BootLoader的Stage 2从预定义的存储设备中(通常是硬盘或闪存)读取操作系统内核映像和根文件系统映像到事先准备好的内存区域。
- 设置启动参数:Stage 2有责任为内核设置启动参数,这些参数包括内核命令行参数、映像加载地址等,以便操作系统能够正确地进行初始化和配置。
- 调用内核:最后,BootLoader的Stage 2会通过跳转或者函数调用的方式将控制权转交给操作系统内核的入口点,以启动操作系统的执行。
启动流程分析:
上电之后,系统会取执行ROM或者Flash里面的Bootloader启动代码,启动代码用来在初始化电路以及用来为高级语言编写的软件做好运行前准备的一小段汇编语言。商业实时操作系统中,启动代码部分一般叫板级支持包(BSP)。Bootloader启动具体流程如下:
1.第一步设置中断和异常向量
2.完成处理器芯片一些寄存器的系统启动的最初配置
3.设置看门狗
4.配置系统存储器,包括Flash、SRAM、和DRAM等,并为它们分配地址空间
5.为处理器的每个工作模式设置栈指针,ARM处理器有多种工作模式,每种工作模式都需要设置单独的占空间
6.变量初始化,软件中已经赋值的全局变量,启动过程把这部分变量从只读区域复制到读写区域,已经赋值的静态全局变量直接固化在只读Flash或EEPROM中
7.数据区准备,软件所有未赋值的全局变量,启动过程中需要把这部分变量所在区域清零
8.调用高级语言入口,比如main函数
3.在ARM架构中,常用的Bootloader有哪些?请分别介绍它们的特点。⭐⭐
以下是一个关于常用ARM架构的Bootloader的特点的表格:
| Bootloader | 特点 |
| U-Boot | - 开源,通用的Bootloader - 支持多种处理器架构和嵌入式平台 - 功能丰富、灵活性高 - 用于启动操作系统、加载内核映像和文件系统等 |
| Das U-Boot | - 在U-Boot基础上进行定制和改进 - 提供更多功能和特定优化 - 快速启动、多协议支持和硬件平台兼容性等 |
| barebox | - 轻量级、模块化的Bootloader - 小巧、可靠、高度可定制 - 适用于资源受限的嵌入式平台 |
| TF-A (Trusted Firmware-A) | - 开源的ARM架构下的Trusted Boot Firmware - 提供安全启动和可信计算功能 - 用于ARM TrustZone技术的系统 - 确保系统启动过程的可信度和安全性 |
4.为什么U-Boot使用最广泛⭐
U-Boot(Universal Bootloader)是一个开源的通用Bootloader,是嵌入式系统中最常用的Bootloader之一。
U-Boot使用最广泛的原因有以下几点:
- 开源和自由:U-Boot是一个开源的Bootloader,遵循GPL许可证。这意味着用户可以自由地使用、修改和分发U-Boot的源代码,无需支付额外费用。这种自由度使得U-Boot成为了许多嵌入式系统开发者的首选。
- 功能丰富:U-Boot提供了广泛的功能,可以满足各种嵌入式系统的需求。它支持多个存储设备和多种网络协议,使得系统启动过程灵活多样。同时,U-Boot还提供了一系列命令和选项,用于配置和优化系统的行为和功能。
- 平台支持广泛:U-Boot支持多种处理器架构和嵌入式平台,包括ARM、x86、PowerPC等。这使得它可以适应各种硬件平台和系统需求。同时,许多芯片厂商和设备制造商都提供了针对其硬件的U-Boot支持和优化。
- 可定制性强:U-Boot具有高度的可配置和可定制性。用户可以通过配置文件和命令行选项来调整和优化U-Boot的行为、功能和启动流程,以满足特定的项目需求。
- 开发社区活跃:U-Boot拥有庞大的开发社区和用户群体,提供了广泛的文档、论坛和贡献资源。这使得用户能够获取相关支持、解决问题并共享经验。同时,开发者可以贡献自己的代码和改进,促进了U-Boot的持续发展和更新。
5.BootLoader的两种模式⭐⭐⭐
1 启动加载模式
启动加载模式又叫自主模式,指Bootloader从目标及某个固件存储设备上将操作系统加载到RAM运行,整个过程没有用户介入,是Bootloader的正常工作模式
2 下载模式
目标机上的Bootloader将通过串口或网络或USB等其它通信手段从主机下载文件,如内核镜像,根文件系统镜像等,从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后被Bootloader写到目标机的Flash内的固态存储设备中。这种模式通常在第一 次安装内核和根文件系统时使用。系统更新也会使用这种工作模式。
6.Bootloader的依赖性⭐⭐⭐
- 硬件依赖性:每个硬件平台都有不同的架构、外设和寄存器配置。因此,Bootloader的实现必须与特定硬件平台的细节相匹配。这包括处理器类型、时钟频率、外设控制寄存器地址、中断和异常处理等。Bootloader需要正确地配置和操作硬件以实现正常的启动加载和初始化过程。
· 设备配置依赖性:即使两个嵌入式板卡采用相同的处理器,它们的外设配置、内存映射和引导设备等可能仍然存在差异。因此,为了让Bootloader能够在不同的嵌入式板卡上运行,可能需要进行适当的参数配置和源代码的调整。这包括处理内存布局、引导设备的选择、时钟设置以及其他特定的硬件配置等。
· 通信接口依赖性:根据具体的应用场景,Bootloader可能需要与主机或其他外部设备进行通信,如通过串口、以太网或USB接口。为了使Bootloader能够与这些接口正确交互,可能需要针对所用接口的规范和协议进行配置或开发相应的驱动程序。
· 引导设备和文件系统依赖性:Bootloader通常从引导设备(如Flash、硬盘或SD卡)中加载映像文件(如操作系统内核或应用程序)。为了正确读取和加载这些文件,Bootloader需要了解并支持特定的引导设备类型和文件系统格式。
7.Bootloader的启动方式⭐⭐⭐
引导加载程序(Bootloader)启动:
- 内部ROM启动:在芯片的内部ROM存储器中预装的引导加载程序,处理器上电或复位时直接执行。
- 外部存储器启动:引导加载程序存储在外部存储器(如Flash、SD卡等)中,处理器上电或复位时从外部存储器加载并执行。
- 刷写引导方式:通过工具或通信接口将引导加载程序刷写到目标设备的存储器中。
网络启动方式:
- 网络引导启动:通过以太网接口远程下载内核映像或文件系统,实现通过网络启动设备。
- PXE(Preboot Execution Environment)引导:通过网络引导服务器(如DHCP、TFTP、FTP等)提供的服务远程引导设备。
磁盘启动方式:
- BIOS引导:使用电脑主板上的BIOS(基本输入/输出系统)进行引导,从硬盘、软盘或光盘中的引导扇区加载引导加载程序。
- UEFI引导:使用统一的EFI(可扩展固件接口)进行引导,支持更大容量的硬盘、安全引导、图形界面等功能。
USB启动方式
- USB引导:通过连接到计算机的USB接口上的USB设备(如USB闪存驱动器)引导。
Flash启动方式:
- 直接从Flash启动:引导加载程序存储在Flash存储器中,处理器上电或复位时直接执行Flash存储器中的引导加载程序。
- 从Flash复制并解压到RAM启动:将压缩的内存映像文件从Flash存储器复制到RAM中,再从RAM启动。
其他定制化启动方式:
- SD卡启动:通过SD卡存储器中的引导加载程序和操作系统启动设备。
- NAND启动:通过NAND闪存存储器中的引导加载程序和操作系统启动设备。
- JTAG启动:通过JTAG接口进行调试和下载引导加载程序到目标设备中。
8.常见设备种类以及特点。⭐⭐⭐
| 设备类型 | 特点 | 常见设备示例 |
| 字符设备 | 以字节为单位处理数据,通常不使用缓存 | 键盘、鼠标、串口 |
| 块设备 | 数据按块进行处理,支持随机访问和缓存技术 | 硬盘驱动器、光盘驱动器 |
| 网络接口 | 用于网络通信,可基于硬件或纯软件,面向数据包通信 | 网卡、回环接口 |
9.Bootloader如何加载内核镜像?⭐⭐⭐⭐
- 加载内核镜像文件:Bootloader首先需要找到存储设备上的内核镜像文件,并将其读取到内存中。通常,Bootloader会根据特定的规则或配置文件来确定内核镜像的位置和名称。
- 设置内核参数:Bootloader加载内核镜像后,需要设置一些必要的参数,例如传递给内核的命令行参数、内存分布信息以及设备树等。
- 初始化硬件:在加载内核之前,Bootloader可能需要初始化一些硬件设备或执行一些底层的硬件配置。这确保了内核在启动过程中可以正确地访问硬件资源。
- 跳转到内核入口点:一旦内核镜像被加载到内存中并设置好参数,Bootloader会将控制权转移到内核的入口点。这通常通过跳转指令(如跳转到内核的C语言入口函数)或者修改处理器寄存器来实现。
10.什么是交叉编译?为何要有交叉编译⭐⭐
交叉编译是指在一个操作系统平台上编译生成另一个不同平台的可执行程序或库文件的过程。一般情况下,交叉编译是在一台计算机上进行,但生成的目标文件将在另一种不同的处理器架构或操作系统上运行。
为什么要进行交叉编译呢?主要有以下几个原因:
- 跨平台开发:有些应用程序或驱动程序需要在不同的硬件平台上运行,例如在嵌入式系统中或移动设备上。通过交叉编译,在一个平台上可以开发和测试代码,然后将生成的目标文件移植到目标平台上运行,提高了开发效率。
- 资源限制:某些目标平台的资源(如处理器、内存、存储等)可能受限制,而在开发环境中有更强大的资源。通过交叉编译,可以利用开发环境的资源进行编译,生成在目标平台上运行所需的较小且高效的可执行文件。
- 代码保护:有时候,开发者希望保护他们的代码不被轻易读取和修改。通过交叉编译,可以对代码进行编译和加密,生成的目标文件具有更高的安全性。
- 平台特定优化:不同的处理器架构或操作系统有不同的特性和优化方式。通过交叉编译,可以针对特定的目标平台进行优化,生成更高效、更精简的代码。
773

被折叠的 条评论
为什么被折叠?



