bootloader原理介绍

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层,它包含操作系统、文件系统、用户应用程序等,可以方便被更新的代码,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Zotero】【国标csl调教(七)】导入专著M、学位论文D以及百度学术的问题

一、百度学术 百度学术导入的字段(期卷号、页码)等会有严重错误,不建议通过Baidu Scholar导入, 建议在文库编目字段自行查找修改 二、专著【M】以及学位论文【D】的出版地问题 国标对硕博论文【D】和专著【M】要求写上出版地 …

OpenSSL的一些使用案例

目录 一、介绍 二、基本使用 1、Shell (1)文件加解密 (2)生成密钥文件 2、API (1)md5sum (2)AES256加解密 一、介绍 本篇博客重点不是详细描述 OpenSSL 的用法,只…

昇思第7天

模型训练 模型训练一般分为四个步骤: 构建数据集。 定义神经网络模型。 定义超参、损失函数及优化器。 输入数据集进行训练与评估。 数据集加载 import mindspore from mindspore import nn # 从 MindSpore 数据集包中导入 vision 和 transforms 模块。 # visio…

使用DC/AC电源模块时需要注意的事项

BOSHIDA 使用DC/AC电源模块时需要注意的事项 1. 仔细阅读和理解产品说明书:在使用DC/AC电源模块之前,应该仔细阅读和理解产品说明书,了解其性能特点、技术要求和使用方法,以确保正确使用和避免潜在的安全风险。 2. 选择适当的电…

MySQL 9.0 发布了!

从昨晚开始,在DBA群里大家就在讨论MySQL 9.0发布的事情,但是Release Note和官方文档都没有更新,所以今天早上一上班就赶紧瞅了下具体更新了哪些内容? 整体看来,基本没什么创新。下面是9.0新增或废弃的一些特性。 &…

Power Platform功能管理实战概述

Power Platform功能管理实战概述 Microsoft Power Platform是一个强大的低代码开发平台,它使组织能够自动化商业流程、开发自定义应用程序,并加强与客户的连接。该平台由四个主要组件组成:Power Apps、Power Automate、Power BI和Power Virt…

【探索Linux】P.36(传输层 —— TCP协议段格式)

阅读导航 引言一、TCP段的基本格式二、控制位详细介绍三、16位接收窗口大小⭕窗口大小的作用⭕窗口大小的限制⭕窗口缩放选项⭕窗口大小的更新⭕窗口大小与拥塞控制 四、紧急指针温馨提示 引言 在上一篇文章中,我们深入探讨了一种无连接的UDP协议,它以其…

Searchsploit漏洞利用搜索工具的介绍及使用

目录 0x00 介绍0x01 常用参数0x02 使用1. 在线搜索2. 使用步骤3. 使用实例 0x00 介绍 kali自带的,Searchsploit会通过本地的Exploit-db查找软件漏洞信息。 Exploit Database(https://gitlab.com/exploit-database/exploitdb)存储了大量的漏洞…

33.哀家要长脑子了!

憋说了,感觉好不容易长出来的脑子又缩回去了。。。 1.539. 最小时间差 - 力扣(LeetCode) 把所有时间排好序,然后计算两两之间的分钟差就好,但是要注意加上最后一个和第一个的判断,因为这个时间是按字典序来…

AI研究的主要推动力会是什么?ChatGPT团队研究科学家:算力成本下降

AI 研究发展的主要推动力是什么?在最近的一次演讲中,OpenAI 研究科学家 Hyung Won Chung 给出了自己的答案。 近日,斯坦福大学《CS25: Transformers United V4》课程迎来了一位我们熟悉的技术牛人:Hyung Won Chung。 Chung 是 O…

Hadoop-03-Hadoop集群 免密登录 超详细 3节点公网云 分发脚本 踩坑笔记 SSH免密 服务互通 集群搭建 开启ROOT

章节内容 上一节完成: HDFS集群XML的配置MapReduce集群XML的配置Yarn集群XML的配置统一权限DNS统一配置 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次&…

Spring容器生命周期中如前置运行程序和后置运行程序

在Spring容器加入一个实现了BeanPostProcessor接口bean实例,重写postProcessBeforeInitialization、postProcessAfterInitialization方法,在方法里面写具体的实现,从而达到Spring容器在初如化前或销毁时执行预定的程序,方法如下&a…

深入浅出:npm常用命令详解与实践【保姆级教程】

大家好,我是CodeQi! 在我刚开始学习前端开发的时候,有一件事情让我特别头疼:管理和安装各种各样的依赖包。 那时候,我还不知道 npm 的存在,手动下载和管理这些库简直是噩梦。 后来,我终于接触到了 npm(Node Package Manager),它不仅帮我解决了依赖管理问题,还让我…

解决Visual Studio 一直弹出管理员身份运行问题(win10/11解决办法)

不知道大家是否有遇到这个问题 解决办法也很简单 找到启动文件 如果是快捷方式就继续打开文件位置 找到这个程序启动项 右键 选择 兼容性疑难解答(win11 则需要 按住 shift 右键) win10 解决办法 这样操作完后就可以了 win11解决办法按以下选择就行

深入理解策略梯度算法

策略梯度(Policy Gradient)算法是强化学习中的一种重要方法,通过优化策略以获得最大回报。本文将详细介绍策略梯度算法的基本原理,推导其数学公式,并提供具体的例子来指导其实现。 策略梯度算法的基本概念 在强化学习…

AI大模型时代来临:企业如何抢占先机?

AI大模型时代来临:企业如何抢占先机? 2023年,被誉为大模型元年,AI大模型的发展如同一股不可阻挡的潮流,正迅速改变着我们的工作和生活方式。从金融到医疗,从教育到制造业,AI大模型正以其强大的生成能力和智能分析,重塑着行业的未来。 智能化:企业核心能力的转变 企…

【CUDA】 归约 Reduction

Reduction Reduction算法从一组数值中产生单个数值。这个单个数值可以是所有元素中的总和、最大值、最小值等。 图1展示了一个求和Reduction的例子。 图1 线程层次结构 在Reduction算法中,线程的常见组织方式是为每个元素使用一个线程。下面将展示利用许多不同方…

AI-算力集群通往AGI

背景: 自GPT-4发布以来,全球AI能力的发展势头有放缓的迹象。 但这并不意味着Scaling Law失效,也不是因为训练数据不够,而是结结实实的遇到了算力瓶颈。 具体来说,GPT-4的训练算力约2e25 FLOP,近期发布的几个…

双曲方程初值问题的差分逼近(迎风格式)

稳定性: 数值例子 例一 例二 代码 % function chap4_hyperbolic_1st0rder_1D % test the upwind scheme for 1D hyperbolic equation % u_t + a*u_x = 0,0<x<L,O<t<T, % u(x,0) = |x-1|,0<X<L, % u(0,t) = 1% foundate = 2015-4-22’; % chgedate = 202…