bootloader原理介绍

news2025/4/6 11:41:31

bootloader解析

bootloader的引出

在这里插入图片描述

  • 不知道你有没有想过这样一个问题,当你按下电源开关的那一瞬间,第一行代码是如何在芯片上运行起来的呢?我们都知道嵌入式软件代码,是需要通过一定的方式,烧录在硬件芯片中,才能运行。我们所熟知的烧录方式,除了物理刻蚀以外,无论是通讯端口的传输,还是调试端口的烧录,多少都是需要驱动程序作支持,所以说是程序烧录程序,软件启动了软件。

在这里插入图片描述

  • 这听起来就像是我们提着自己的鞋带,把自己给拎了起来,靴子Boot,鞋带Strap,接下来就是Loader,这就是BootStrapLoader最初的命名来源,我们也常简称它为BootLoader,所以也有中文翻译为自举。

程序是如何烧录、运行的

  • 那么最初的软件是怎么烧录进去,运行起来的呢。BootLoader是芯片中最初运行的代码吗?

在这里插入图片描述

  • 其实几乎每一块刚出厂的控制芯片,都在其内部非易失存储器ROM中烧录了属于它最基础的软件,cpu搬运并运行第一条控制代码的默认位置,就在ROM的地址空间,所以一切的起始其实是硬件。

X86架构

在这里插入图片描述

在这里插入图片描述

  • 以x86架构的鼻祖8086为例,按下开关的一瞬间,芯片的reset引脚,接收到了电平跳变,在一连串电路的作用下,代码段寄存器和指令指针寄存器,分别恢复成0xFFFF和0x0000,它们组合而成的20位长度地址,正好对应于ROM存放第一条代码的位置,之后取出这里的指令,再次跳转到别处去。

ARM架构

在这里插入图片描述

  • 而ARM架构的芯片也是类似的过程,对于32位的ARM芯片,上电后,PC指针寄存器直接复位至零地址,随后从中断向量表表头的reset向量处获取下一步跳转的地址。

在这里插入图片描述

  • 这时候的代码,已经是以二进制的形式存储,处理器直接把它搬运到自身的缓存中运行。

在这里插入图片描述

  • 有了这第一步运行起来的代码,就能够跳转到存放有更多更复杂代码的地址,执行一些硬件自检,初始化,提供基础的输入输出支持。

在这里插入图片描述

  • 之后还能把更多的程序以及操作系统,从外部的存储空间加载到内部,代码就这样以一种接力方式流转了起来。

BootRom

在这里插入图片描述

  • 所以我们把出厂就写在ROM(Read Only Memery)里,负责启动后续用户软件的软件称为BootRom或者是RomCode,虽然现在不会用严格意义上的只读存储器,来存放这部分程序,但至少ROM是一块掉电不易失的存储设备,现在都是使用EEPROM或者是NorFlash,且往往我们也没有权限去修改它,不然改错变砖,芯片就真的没药可治了。

在这里插入图片描述

  • 不过BootRom对我们而言也不是完全的黑盒,大部分芯片都会有外部启动配置引脚,通常是以拨码开关的形式,复位后的一段时间内,BootRom会把引脚采集到的高低电平组合存储起来,作为后续动作和启动设备的选择依据。

PC

在这里插入图片描述

  • 而对于PC而言,BootRom对应的其实就是我们常说的Bios,它同样留有启动配置途径,而且提供了交互界面,用于配置部分功能,和选择后续的引导设备。

引导代码

在这里插入图片描述

  • 那么除了芯片自带的BootRom,我们可能还需要给自己实际的应用程序,写一个二次引导代码,或者更多层的引导代码,用作操作系统,文件系统加载,以及后续程序的刷新,也就是常说的在应用编程-IAP。当我们在说bootloader时,我们指的其实也大多数是这样的二次引导代码。
  • 那么有了解过的朋友就可能会有疑问,上面的这些事好像大部分芯片的BootRom也能做,那么还需要bootloader做什么,其实原因就在于BootRom实现的功能和配置方法不够灵活,且不一定有你想要实现的功能, 而用作二次引导的bootloader,是开发人员可以完全控制的引导代码,你可能希望在上电启动后,跳转OS之前,或者是在检查代码更新请求的阶段,已经有一部分基础软件是可用的,那么就需要自己编写bootloader来实现。

实例解释

在这里插入图片描述

  • 举个例子,以汽车上的智驾控制器而言,为它设计的bootloader,就需要提供符合UDS统一诊断服务标准的CAN诊断服务和刷新服务,这就要求我们必须要在另外的bootloader中把这些工作给做掉,而不能指望芯片自身的BootRom。

Bootloader的设计

在这里插入图片描述

  • 在设计bootloader时,MCU的引导步骤,便开始和嵌入式Linux或PC有所不同。这一定程度上,也与不同芯片架构所采用的存储方案有关。

MCU

在这里插入图片描述

  • 先来说MCU,与SOC相比,MCU的主要特称是单核和或多核同构的微处理器,主频一般不超过1G赫兹,一般没有MMU内存管理单元,通常最多只能运行RTOS实时操作系统。

在这里插入图片描述

  • 常见的MCU,多基于ARM的cortex M和cortex R系列内核,英飞凌自有的tricore内核,TI自有的C28x系列内核等等。

在这里插入图片描述

  • MCU下程序运行的主要介质基本都是NOR Flash,因为它和RAM一样有分离的地址线和数据线,并且可以以字节长度精确寻址,所以Nor Flash中的程序是不需要拷贝到RAM中运行的。

在这里插入图片描述

  • 以英飞凌家的TC27x系列的MCU为例,它上电后的默认取址位置,是0x8FFF 8000,这就是它的BootRom在NorFlash中的地址,并且这块BootRom分为SSW(Startup Software),BSL(Bootstrap Loader)也就是厂商提供的系统bootloader,TF(Test Firmware)三个部分。

在这里插入图片描述

  • SSW是每次上电必须要运行的,它会根据写在program flash(PF0)地址的前32byte中的配置字,来决定SSW执行完的跳转地址。

在这里插入图片描述

  • 我们可以选择一个合适的跳转地址,比如0x80000020,放上自己写的bootloader。

在这里插入图片描述

  • 也可以选择不跳转,运行厂家提供的系统bootloader,来实现对外部代码的接收。

在这里插入图片描述

  • 不管你用不用它,但还是那句老话,我们没有权限对这片flash地址进行修改。

  • 不同mcu芯片的启动形式呢,又都不尽相同,比如采用Coretex-M内核的stm32系列mcu,如前面所说,启动时会固定跳转到0地址处。

在这里插入图片描述

  • 它可以选择把System Boot也就是ARM中的BootRom的地址,0x1FFF 0000映射到零地址处。

在这里插入图片描述

在这里插入图片描述

  • 也可以选择把存放用户代码的internal flash或ram的地址映射到这里,这些选择都是通过两个外部引脚的电平配比来实现的,而你自己写的bootloader就应该放在internal flash的起始处,并且把它映射到零地址处。

在这里插入图片描述

  • MCU下的bootloader主要需要完成的事情有:
    • 1.关闭看门狗,初始化中断和trap向量表,进行时钟和外设初始化,让芯片正常运行起来。
    • 2.提供CAN、UART、ETH等用于通讯功能的驱动,能够接受外部数据传输请求。
    • 3.提供flash的读写与擦除驱动,设计服务来对通讯端口接收到的更新代码进行校验、存储,以及跳转操作系统或后续应用程序代码。
    • 4.如有必要,还会开发一些基础诊断服务,串口交互程序等等。

嵌入式linux

在这里插入图片描述

  • 那么运行嵌入式Linux的SOC和PC的这一过程有何不同呢,还是先看存储方案,运行嵌入式Linux的SOC,一般将它的操作系统、文件系统和它的应用程序放在nand flash中。

在这里插入图片描述

  • 处理器运行代码前,需要先将代码从NAND搬运到SRAM中,相比MCU多了一道步骤。

在这里插入图片描述

PC

  • PC的存储方案与之类似,NAND一般换做机械硬盘,或者同样属于NAND的固态硬盘一类,所以对于SOC的BootROM和PC的Bios而言,它们结束运行前的最终任务,是将某些代码从nand flash,搬运到内部SRAM中。

在这里插入图片描述

在这里插入图片描述

  • 转移的重要内容就是bootloader,而一般SOC的bootloader又分为SPL(Secondary Progarm Loader)和UBOOT两个阶段,SPL的Secondary 就是相对BootROM而言,它就像是接力赛中的第二棒选手,那么首先被搬运到内部SRAM中的SPL,会初始化空间更大的外部的DRAM,在负责把Uboot搬运至外部RAM中去运行,这就完成了它第二棒的交接。

在这里插入图片描述

  • 而uboot作为第三棒选手,它开始运行它的初始化程序,之后再根据系统环境变量将OS内核搬运到外部RAM中去运行,完成它这一棒的交接,同样的OS再去完成跟文件系统的加载。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 总结来看,虽然对不同的芯片架构,在不同的芯片手册中,可能会对这几个阶段的引导代码,有着不同的称法和应用方式,但芯片的启动基本都逃不过这三层的引导结构:
    • 第一层就是芯片出厂自带的BootRom,用于硬件自检和初始化,加载Bootloader、提供外部配置引脚。
    • 第二层就是我们自己写的Bootloader层,可以通过它访问外部RAM、NANDFlash等更多的存储设备,初始化时钟、通讯等,接收、存储以及跳转代码。
    • 第三层就是我们常见的app层,它包含操作系统、文件系统、用户应用程序等,可以方便被更新的代码,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1888807.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu安装搜狗\谷歌输入法

目录 1 安装搜狗输入法 1.1 安装Fcitx输入框架 1.2 下载搜狗输入法安装包 1.3 安装搜狗输入法 1.4 打开配置 1.5 选择fcitx 1.6 重启系统 1.7 配置输入法 1.8 添加搜狗输入法 1.9 使用 2 安装谷歌输入法 2.1 下载fcitx-googlepinyin 2.2 选择fcitx 2.3 重启系统 …

hive小练习 拓展

基于hive表小练习-CSDN博客的拓展 -- 1. 查询没有参与任意一门考试的学生姓名 LEFT JOIN操作时,数据库系统会从左表(即LEFT JOIN关键字左边的表)返回所有的行, 即使在右表(即LEFT JOIN关键字右边的表&#xff09…

Python便捷数据处理库之Baisou使用详解

概要 Baisou,中文译名为“便捷数据处理库”,是一个基于Python的库,旨在简化数据处理和分析的过程。它拥有丰富的数据类型和函数,可以帮助开发者轻松地处理数据,进行统计分析,以及实现复杂的数据转换。Baisou的设计理念是“简单、高效、易用”,让开发者能够更加专注于业…

无线领夹麦克风哪个牌子好,口碑最好的麦克风品牌良心推荐

在自媒体行业迅速发展的背景下,无线领夹麦克风已成为提升音频质量的重要工具。它能够在多种环境中保持语音的清晰度,有效增强创作效率和作品的专业性。市场上有许多无线麦克风产品,但并非所有都兼具高性能与合理价格。基于我的个人使用经验&a…

Firewalld 防火墙基础

Firewalld 防火墙基础 一、Firewalld概述firewalld 简介firewalld 和 iptables 的关系firewalld 与 iptables service 的区别 二、Firewalld 网络区域区域介绍Firewalld数据处理流程 三、Firewalld 防火墙的配置方法firewall-config 图形工具“区域”选项卡“服务”选项卡改变防…

5.3.3、二维数组案例-考试成绩统计

代码 #include <iostream> using namespace std; #include <string>int main() {//二维数组案例-考试成绩统计//1、创建二维数组int scores[3][3] {{100,100,100},{90,50,100},{60,70,80},};string names[3] { "张三","李四","王五&quo…

基于微服务智能推荐健康生活交流平台的设计与实现(SpringCloud SpringBoot)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

MATLAB—— 流程语句(1)

一、if elseif else end 语句 例子 x 88; % x表示成绩 if x>90 && x < 100 dj 1; % 等级为1级 elseif x>80 && x < 90 dj 2; % 等级为2级 elseif x>60 && x < 80 dj 3; % 等级为…

信息打点web篇---前端js打点

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理前端js代码的打点思路 本文只为学习安全使用&#xff0c;切勿用于非法用途。 一切未授权的渗透行为都是违法的。 前端js打点概念与目的 javascript文件属于前端语言&#xff0c;也就是说他的代码都…

AI商品图生成定制外包公司

&#x1f308; 深度剖析AI商品图生成定制外包公司 —— 触站AI&#xff0c;智能图像的魔法师 &#x1f9d9;‍♂️ &#x1f389;触站AI&#xff0c;以技术创新引领行业变革 &#x1f389;在这个AI技术飞速发展的时代&#xff0c;触站AI以其专业和专注&#xff0c;成为了深圳乃…

容嬷嬷给紫薇过生日:鬼畜搭台,AI带货

刚入7月&#xff0c;短视频平台已被AI视频续写占领。 类似于紫薇在地牢里被容嬷嬷喂西瓜、喂鸡翅、喂蛋糕。张学友在《旺角卡门》的经典镜头突然给你微笑、嘟嘴、甚至祝你生日快乐。甚至&#xff0c;还有吴京从打斗戏变成亲吻戏。 在AI续写的短视频里&#xff0c;你永远也想象…

Python小练习05

一 绘制如下图形。 #Q1 import turtle as t def draw(n):for i in range(n):t.left(30)t.fd(100)t.left(120)t.fd(100)t.left(120)t.fd(100)t.left(120)t.fd(100)t.right(90) t.penup() t.goto(-150,20) t.speed(0) t.pendown() t.pencolor("red") t.pensize(5) draw…

权限控制权限控制权限控制权限控制权限控制

1.权限的分类 视频学习&#xff1a;https://www.bilibili.com/video/BV15Q4y1K79c/?spm_id_from333.337.search-card.all.click&vd_source386b4f5aae076490e1ad9b863a467f37 1.1 后端权限 1. 后端如何知道该请求是哪个用户发过来的 可以根据 cookie、session、token&a…

5.2.3、冒泡排序

代码 #include <iostream> using namespace std;int main() {//冒泡排序升序int arr[9] { 4,2,8,0,5,7,1,3,9 };cout << "排序前&#xff1a;" << endl;for (int i 0; i < 9; i){cout << arr[i] << " ";}cout <<…

python-图像模糊处理(赛氪OJ)

[题目描述] 给定 n 行 m 列的图像各像素点的灰度值&#xff0c;要求用如下方法对其进行模糊化处理&#xff1a; 1. 四周最外侧的像素点灰度值不变。 2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均&#xff08;四舍五入&#xff09;输入&#xff…

pydub、ffmpeg 音频文件声道转换、采样率更改

转换成mono单声道 from pydub import AudioSegment# 加载MP3文件 mp3_file_path r"E:\allchat\output.wav" audio_segment AudioSegment.from_mp3(mp3_file_path)# 转换为单声道 audio_segment audio_segment.set_channels(1)# 导出为单声道MP3文件 mono_mp3_fil…

LinuxRT启动Veristand项目的配置文件

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

c语言回顾-数组(全网最详细,哈哈哈)

目录 前言&#xff0c;和小编一起感受数组的魅力&#xff01;&#xff01;&#xff01; 1.数组的概念 2.一维数组的创建和初始化 2.1数组创建 2.2数组的初始化 2.3数组的类型 3.一维数组的使用 3.1数组下标 3.2数组元素的输入输出 小结&#xff1a; 4.一维数组在内存…

SpringBoot环境集成 sms4j短信聚合

SpringBoot环境集成 sms4j短信聚合 官方文档 前言 在正式使用sms4j短信功能之前&#xff0c;请详细阅读本文档&#xff0c;依照本篇流程进行操作和配给&#xff0c;即可解决大部分问题&#xff0c;如对我们的文档有建议&#xff0c;请联系开发者团队&#xff0c; 我们将根据可…

Spring与Quartz整合

Quartz框架是一个轻量级的任务调度框架&#xff0c;它提供了许多内置的功能&#xff0c;包括&#xff1a;支持作业的调度、集群调度、持久化、任务持久化、任务依赖、优先级、并发控制、失败重试等。同时也支持自定义作业类型和触发器类型。与Spring整合步骤如下&#xff1a; …