嵌入式基础(四)之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 (Trust |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本人2022年毕业于山东大学,目前就职intel。打算把之前校招时做的笔记通过专栏发出来,本专栏适合于C/C++、嵌入式方向就业的同学,本篇面经总结数千篇面经的知识集合,实时更新全网最新的嵌入式/C++最新内容,囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,在我看来这些是求职者在面试中必须掌握的知识点。最后呢祝各位能找到自己合适的工作。