嵌入式芯片启动过程全解析,彻底理解bootloader

news2024/11/20 20:42:00

当你按下电源开关的那一瞬间,第一行代码,是如何在芯片上运行起来的呢?

我们都知道嵌入式软件代码,是需要通过一定的方式,烧录在硬件芯片中才能运行,而我们所熟知的烧录方式,除了物理刻蚀以外,无论是通讯端口的传输,还是调试端口的烧录,多少都是需要驱动程序作支持。所以说是程序烧录程序,软件启动了软件。这听起来就像是我们提着自己的鞋带,把自己给拎了起来,这就是BootStrapLoader最初的命名来源,我们也常简称它为Boot Loader。所以也有中文翻译为自举。
那么最初的软件是怎么烧录进去,运行起来的呢?bootloader是芯片中最初运行的代码吗?其实几乎每一块刚出厂的控制芯片,都在其内部非遗失存储器ROM中,烧录了属于他最基础的软件,cpu搬运并运行第一条代码的默认位置,就在ROM的地址空间,所以一切的起始其实是硬件。以x86架构的鼻祖8086为例,按下开关的一瞬间,芯片的reset引脚,接受到了电平跳变,在一连串电路的作用下,代码段寄存器和指令指针寄存器,分别恢复成0xFFFF和0x0000,他们组合而成的20位长度地址。
在这里插入图片描述
正好对应于ROM存放第一条代码的位置,在这里插入图片描述
之后取出这里的指令,再次跳转至别处去。
在这里插入图片描述
而ARM架构的芯片也是类似的过程,对于32位的ARM芯片,上电后,PC指针寄存器直接复位至零地址
在这里插入图片描述
随后从中断向量表表头的reset向量处,获取下一步跳转的地址。
在这里插入图片描述
这时候的代码是以二进制进行存储,处理器直接把它搬运到自身的缓存中运行。有了这第一部分运行起来的代码,就能够跳转至存放有更多复杂代码的地址,执行一些硬件自检、基本初始化、提供基础的输入输出支持,之后还能把更多的程序以及操作系统从外部存储空间加载到内部:
在这里插入图片描述
在这里插入图片描述
代码就这样,以一种接力方式流转起来,所以我们把出厂就写在ROM里,负责启动后续用户软件的软件称为BootRom或者是RomCode。虽然现在已经不会用严格意义上的只读存储器来存放这部分程序,但至少ROM是一块掉电不易失的存储设备,现在都是使用EEPROM或者是NorFlash,且往往我们也没有权限去修改它,不然改错变砖,芯片就真的没药可治了。不过BootRom对于我们而言,也不是完全的黑盒,大部分芯片都会有外部启动配置引脚,通常是以拨码开关的形式,复位后的一段时间内,BootRom会把引脚采集到的高低电平组合存储起来,作为后续动作和启动设备的选择依据。而对于pc而言,BootRom对应的其实就是我们常说的Bios,他同样留有启动配置途径,而且提供了交互界面,用于配置部分功能,和选择后续的引导设备。那么除了芯片自带的BootRom,我们可能还需要再给自己实际的应用程序,写一个二次引导代码,或者更多层的引导代码,用作操作系统、文件系统加载以及后序程序的更新。也就是常说的在应用编程-IAP。当我们在说bootloader时,我们指的其实也大多数是这样的二次引导代码。
上面的事情大部分芯片的BootRom也能做,还需要bootloader做什么?

其实原因在于,BootRom实现的功能和配置方法不够灵活,且不一定有你想要实现的功能,而用作二次引导的bootloader,是开发人员可以完全控制的引导代码,你可能希望在上电启动后,跳转OS之前,或者是在检查代码更新请求的阶段,已经有一部分基础软件是可用的,那么就需要自己编写bootloader来实现。

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

在设计bootloader时,MCU的引导步骤,便开始和嵌入式Linux或PC有所不同,这一定程度上也与不同芯片架构所采用的存储方案有关。先来说MCU,与SOC相比,MCU的主要特征是单核和或多核同构的微处理器。主频一般不超过1G赫兹,般没有MMU内存管理单元。通常最多只能运行RTOS。
在这里插入图片描述
常见的MCU:多基于ARM的cortexM和cortexR系列内核、英飞凌自有的tricore内核、TI自有的C28x系列内核等等。
在这里插入图片描述
MCU下程序运行的主要介质:

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

以英飞凌家的TC27x系列MCU为例,
在这里插入图片描述
上电默认读取位置是0x8FFF 8000,这就是他的BootRom。在NorFlash中的地址,并且这块BootRom分为SSW(也就是厂商提供的系统bootloader,SSW是每次上电必须要运行的),
在这里插入图片描述
他会根据写在 program flash,PF0地址的前32byte中的配置字来决定SSW执行完的跳转地址,我们可以选择一个合适的跳转地址
在这里插入图片描述
在这里插入图片描述
比如0x800000020,放上自己写的bootloader,
在这里插入图片描述
也可以选择不跳转,运行厂家提供的系统bootloader
在这里插入图片描述
来实现对外部代码的接收,不管你用不用它,还是那句老话,我们没有权限,对这片flash地址进行修改。

不同mcu芯片的启动形式又不尽相同:

比如采用Cortex-M内核的 stm32系列,如前面所说,启动时会固定跳转到0地址处,他可以选择把SystemBoot,也就是ARM中的BootRom的地址0x1FFF 0000映射到零地址处。
在这里插入图片描述
在这里插入图片描述
也可以选择把存放代码的internal Flash或ram的地址映射到这里:
在这里插入图片描述
这些选择都是通过两个外部引脚的电平配比来实现的,而你自己写的bootloader就应该放在internal flash的起始处并且把它映射到零地址。

MCU下的bootloader 需要完成的事情有:
在这里插入图片描述
那么运行嵌入式 Linux的SOC和PC的这一过程有何不同呢?

先看存储方案:运行嵌入式Linux的SOC,一般将他的操作系统、文件系统和他的应用程序放在nandflash中。处理器运行代码前需要先将代码从NAND搬运到SDRAM中,相比MCU多了一道步骤
在这里插入图片描述
PC的存储方案与之类似,NAND一般换做机械硬盘,或者同样属于NAND的固态硬盘一类,所以对于SOC的BootROM和PC的BIOS他们结束运行前的最终任务:是将某些代码从nandflash搬运到内部SRAM中。临shi前转移的重要内容就是bootloader,而一般SOC的bootloader,又分为SPL(Secondary Program 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/699129.html

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

相关文章

数据分析知识图谱

在做数据分析时,经常会有这样的困扰:面对几种相似的方法,既不清楚它们各自的使用场景,也无法分清它们之间的差别,一念之差就可能选错方法。如果你也有这样的困扰,建议按照SPSSAU知识图谱目录顺序检索对应的…

【万字】一文教会你关于“生成对抗网络GAN”的所有知识

1 GAN基本概念 1.1 GAN介绍 GAN的英文全称是Generative Adversarial Network,中文名是生成对抗网络。它由两个部分组成,生成器和鉴别器(又称判别器),生成网络(Generator)负责生成模拟数据&…

深度分析我国“智慧+”养老模式的发展情况

随着我国的老龄化人口结构的不断加深,传统旧的养老服务模式已经无法全面适应当前的养老市场的需求,因此需要寻求更加新型的、多元化的模式来解决老年人的不同层次的需求,“智慧”养老的服务模式从而成为了新养老产业发展的主要导向。 “智慧…

【1089. 复写零】

目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 class Solution { public:void duplicateZeros(vector<int>& arr){//找出最后一个数int dest-1,cur0;for(;;cur){if(arr[cur]){dest;}else{dest2;}if(dest>arr.size()-1){bre…

GPT-4:AI的新突破,重塑芯片设计领域

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;其在各个领域的应用也日益广泛。最近&#xff0c;纽约大学Tandon工程学院的研究人员利用OpenAI的GPT-4模型&#xff0c;成功设计出了一个芯片&#xff0c;这标志着AI在硬件设计领域的重大突破。 GPT-4通过简单的英…

华为战略方法论:BLM模型之差距分析(限制版)

目录 说明 差距类型 1、业绩差距 2、机会差距 3、对标差距 专栏列表 个人简介 说明 今天就来谈谈 BLM 模型中的第一把钥匙&#xff0c;也就是差距分析。 从本质上来看。 BLM 模型中的差距与你在日常生活中听到或用到的差距在意义都是一样的。 不同之处就在于问题的复…

数据迁移工具,用这8种!

前言 最近有些小伙伴问我&#xff0c;ETL数据迁移工具该用哪些。 ETL(是Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程)&#xff0c;对于企业应用来说&#xff0c;我们经常会遇到各种数据的处理、转换、迁移的场景。 今天特地给大家汇总了一些目前…

chatgpt赋能python:Python遍历n中所有数字

Python 遍历 n 中所有数字 Python 是一种高级编程语言&#xff0c;它被广泛用于许多应用程序和领域&#xff0c;如机器学习、人工智能和数据可视化等。Python 在处理数字时非常方便&#xff0c;因为它支持大量的数字操作和运算。在这篇文章中&#xff0c;我们将讨论如何使用 P…

C++制作简易计算器

C简易计算器 C简易计算器栈栈(Stack)的特点栈的相关概念栈的常用操作为栈的常见分类实例计算器概念代码实现测试 效果展示 简易计算器实现的功能&#xff1a; 基本的加减乘除、表达式错误判断、除法运算分母不能为0、支持多项式表达计算&#xff0c;自己封装一个模板栈、封…

介绍 9 个研发质量度量指标

研发质量管理中的 MTTR、MTBF、MTTF、MTTD 都是什么&#xff1f;今天我们从生产事件的全生命周期出发&#xff0c;认识研发质量管理的 9 个度量指标——「MT 家族」。 01 Mean Time To ALL 「MT」是 Mean Time 的缩写&#xff0c;意为平均时间&#xff0c;「MT 家族」则是 Li…

OpenStack(T版)——仪表板(Horizon)服务介绍与安装

文章目录 OpenStack(T版)——仪表板(Horizon)服务介绍与安装安装和配置Horizon仪表板服务组件(1)安装软件包(2)修改配置文件(3)修改httpd文件完成安装 访问 OpenStack(T版)——仪表板(Horizon)服务介绍与安装 Openstack项目中的Horrizon仪表板服务组件是以Web界面形式展示各项…

【shell脚本百炼成魔】shell脚本之函数实战

前言 文章目录 前言函数的概念函数的基本语法1.使用关键字 function&#xff1a;2.直接使用函数名和大括号&#xff1a; 函数的简单案例案例一&#xff0c;欢迎函数案例二&#xff1a;购物清单 函数的传参1. 位置参数2. 命令替换3. 数组参数 函数的返回值1. 判断函数的执行结果…

SVNKit 1.10.8: svn add和svn commit方法总结

SVNKit 1.10.8: svn add和svn commit方法实现总结&#xff1a; doAdd(java.io.File path, boolean force, boolean mkdir, boolean climbUnversionedParents, SVNDepth depth, boolean depthIsSticky, boolean includeIgnored, boolean makeParents) 参数是的含义及作用&…

实现淘宝母婴订单实时查询和可视化|Flink-Learning实战营

为进一步帮助开发者学习使用 Flink&#xff0c;Apache Flink 中文社区近期发起 Flink-Learning 实战营项目。本次实战营通过真实有趣的实战场景帮助开发者实操体验 Flink&#xff0c;课程包括实时数据接入、实时数据分析、实时数据应用的场景实。并结合小松鼠助教模式&#xff…

K8s组件:etcd安装、使用及原理(Linux)

K8s组件&#xff1a;etcd安装、使用及原理&#xff08;Linux&#xff09; 1 介绍及安装 1.1 介绍 分布式系统架构中对一致性要求很高&#xff0c;etcd就满足了分布式系统中的一致性要求。 实现了分布式一致性键值对存储的中间件&#xff0c;支持跨平台&#xff0c;有活跃的…

交互式标注工具-Paddlelabel

PaddleLabel 是基于飞桨 PaddlePaddle 各个套件功能提供的配套标注工具。目前支持对分类、检测、分割、OCR 四种常见的计算机视觉任务数据集进行标注和管理&#xff0c;除基础的手动标注功能外也支持深度学习辅助标注&#xff0c;可以有效地提升标注效率。重点是free free free…

玩转代码|那些实用的JavaScript单行代码,帮你轻松工作

目录 数组去重 从url获取参数并转为对象 检查对象是否为空 反转字符串 生成随机十六进制 检查当前选项卡是否在后台 检测元素是否处于焦点 检查设备类型 文字复制到剪贴板 获取选定的文本 查询某天是否为工作日 转换华氏/摄氏 两日期之间相差的天数 将 RGB 转换为…

并发-编程之JMMvolatile详解

并发三大特性&#xff1a;可见性、原子性、有序性 并发都是数据【多线程对一个变量进行连续加1】 线程A和B都对count进行连续加1&#xff0c;因为count不是原子性&#xff0c;如果再执行countcount1之前cpu执行权被抢占&#xff0c;就会阻塞住&#xff0c;这时候线程B完成count…

基于Java车库智能管理平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Java | 使用切面AOP拦截并修改Controller接口请求参数

关注common wx&#xff1a; CodingTechWork 引言 在开发过程中&#xff0c;会有一些需求将controller层的一些方法入参进行全量转换&#xff0c;最容易想到的可能是在调用下层service方法时&#xff0c;调用公共的方法进行入参转换&#xff0c;这时带来的唯一问题就是代码不雅…