Bootloader

启动代码是系统上电或复位后运行的第一段代码,负责硬件初始化和跳转到用户程序。Bootloader是一个完整的引导装载程序,包含启动代码,用于在操作系统运行前初始化硬件和设置内存映射。Boot Loader有启动加载和下载两种模式,通常分为stage1和stage2两个阶段,前者完成硬件初始化,后者加载内核并传递启动参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

启动代码与Bootloader

注意:很多初学者总是将启动代码和Bootloader联系在一起,这是错误的

什么是启动代码?

      启动代码是系统上电或者复位后运行的第一段代码,是进入C 语言的main 函数之前需要执行的那段汇编代码。

启动代码有何用?

      它的作用是在用户程序运行之前对系统硬件及软件环境进行必要的初始化并在最后使程序跳转到用户程序。它直接面对ARM 处理器内核及硬件控制器进行编程,所执行的操作与具体的目标系统紧密相关。

      C语言程序的运行需要具备一定的条件,如分配好外部数据空间,堆栈空间和中断入口等。另外,汇编代码可以更直接地对硬件进行操作,效率更高,这对启动中断等对时间要求更高的情况是非常必要的

什么是Bootloader?

      Bootloader不是一段代码,它是一个具有引导装载功能的完整的程序,如可以引导装载linux的vivi,uboot,以及通常PC机上的BOIS程序等。

启动代码和Bootloader关系?

      Bootloader也包含了相应的启动代码,也就是说,启动代码是Bootloader的一部分,是所有相应应用程序的一部分。


Bootloader讲解

       简单地说,BootLoader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

      系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。这是由处理器设计决定的。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。

Boot Loader 的操作模式

       通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。

       启动加载(Boot loading)模式:这种模式也称为"自主" (Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader 显然必须工作在这种模式下。

      下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。

 Boot Loader的组成

       从操作系统的角度看,BootLoader 的总目标就是正确地调用内核来执行。另外,由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。

一、Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序)

首先是硬件设备初始化。这是 Boot Loader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):

1.屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不        必响应任何中断。中断屏蔽可以通过写 CPU的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完      成。

2.设置 CPU 的速度和时钟频率。

3.RAM 初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。

等。

之后是下面的步骤:

      为加载Boot Loader 的 stage2 准备 RAM 空间。

      拷贝Boot Loader 的 stage2 到 RAM 空间中。

      设置好堆栈。

      跳转到stage2 的 C 入口点。

二、Boot Loader的 stage2 通常包括以下步骤(以执行的先后顺序)

      初始化本阶段要使用到的硬件设备。

      检测系统内存映射(memory map)。

      将kernel 映像和根文件系统映像从 flash 上读到RAM 空间中。

      为内核设置启动参数。

      调用内核。

下面这个截图是在一篇PDF文档上看到的,觉的不错,贴在此处。



bootloader的最终目的是启动内核,又为了方便开发,可以加入串口、网卡、烧写flash等功能。

### Bootloader 的工作原理及使用方法 Bootloader 是嵌入式系统中的一个关键组件,其主要功能是在设备启动时初始化硬件,并加载应用程序。以下是关于 Bootloader 工作原理及使用方法的详细说明。 #### 1. Bootloader 的工作原理 Bootloader 是微控制器在上电或复位后执行的第一段代码。它的主要任务是完成硬件初始化、加载应用程序到内存中,并将控制权交给应用程序。在某些情况下,Bootloader 还支持固件升级功能(如 IAP 或 OTA)。以下为 Bootloader 的典型工作流程: - **硬件初始化**:在微控制器启动时,Bootloader 首先会对硬件资源进行初始化,包括时钟配置、外设设置等[^1]。 - **程序加载**:Bootloader 将应用程序从存储介质(如 Flash)加载到运行内存中(如 RAM),并确保其正确性。 - **跳转到应用程序**:当硬件和软件环境准备好后,Bootloader 将通过跳转指令将控制权交给应用程序[^1]。 - **固件更新支持**:部分 Bootloader 支持在线升级功能,允许用户通过串口、USB 或网络接口更新应用程序固件[^2]。 #### 2. Bootloader 的使用方法 以 STM32 系列微控制器为例,Bootloader 的使用方法通常包括以下几个方面: - **启动模式选择**:STM32 的 Bootloader 可以通过引脚配置选择不同的启动模式(如主 Flash、系统存储器或 SRAM)。开发者需要根据具体需求设置 BOOT 引脚[^2]。 - **固件加载与更新**:Bootloader 支持多种通信协议(如 UART、USB DFU 等)用于加载或更新应用程序。开发者可以通过这些接口发送新固件到目标设备[^2]。 - **示例代码实现**: 以下是一个简单的 STM32 Bootloader 跳转到应用程序的代码示例: ```c #include "stm32f10x.h" void JumpToApplication(uint32_t ApplicationAddress) { typedef void (*APP_Function)(void); volatile uint32_t *pAppStack = (uint32_t *)ApplicationAddress; APP_Function AppMain = (APP_Function)(*pAppStack); // 设置栈指针 __set_MSP(*pAppStack); // 跳转到应用程序入口 AppMain(); } int main() { uint32_t ApplicationAddress = 0x08004000; // 应用程序起始地址 JumpToApplication(ApplicationAddress); return 0; } ``` 上述代码展示了如何从 Bootloader 跳转到应用程序。开发者可以根据实际需求调整 `ApplicationAddress` 的值。 #### 3. Bootloader 的设计注意事项 - **存储分区管理**:Bootloader 和应用程序通常位于 Flash 的不同区域,开发者需要合理规划存储空间[^1]。 - **异常处理**:在跳转到应用程序之前,Bootloader 应确保所有必要的初始化已完成,否则可能导致系统崩溃[^1]。 - **兼容性与扩展性**:设计 Bootloader 时应考虑未来可能的功能扩展,例如支持多种通信协议或加密机制[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值