• 正文
  • 相关推荐
申请入驻 产业图谱

STM32也能运行双系统嘛?FSBL引导加载程序的简单介绍以及用途推测!

03/15 11:25
3035
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1、FSBL介绍

FSBL是STM32N6微控制器引导过程中的“第一阶段引导加载程序”的简称,负责上电时系统的初始化、配置硬件,并将应用程序代码从外部Flash/ROM加载到内部或外部存储器中执行。当系统复位时,引导 ROM 遵循特定的步骤序列。 这段话似乎难以理解,我们接下来引用图解。(本文以介绍和猜测为主暂无代码验证)

2、FSBL模式

STM32N6的存储分布大体如图所示,其中地址0x18000000起至0x1801FFFF为BOOTRAM对应系统引导程序。

0x70000000之后为外部FLASH,FSBL的二进制文件从这里开始总共511KB。

这里的FSBL的二进制文件包含了代码部分以及签名头,FSBL的二进制文件必须经过签名之后才可以被STM32的BOOTROM引导程序启动。这缺少的1K空间就是给签名用的。

之后我会出文章演示使用STM32CubeProgram进行文件签名。

BOOTLoader会将FSBL代码复制到搬运至内部SRAM2,地址0x34180000中开始,因此这个地址非常的重要,代表着FSBL代码区,之后跳转到FSBL代码区运行。

这种方法的劣势很多,主要是FSBL的空间只有511KB,想要扩大空间就需要参考接下来的模式。

3、FSBL+Appliction

在此基础上,我们可以编写主要的程序代码,将其二进制文件烧录至外部FLASH。

该模式下启动步骤总共有四步:首先是BOOTLoader跳转到外部FSBL代码区,将外部存储的FSBL二进制文件拷贝到内部存储的0x34180000处。

FSBL开始执行,然后拷贝Application的完整内容到内部SRAM。然后跳转到APP代码进行执行。

这样子做的好处是可以解决FSBL只能存放最多511KB代码的问题。

因为内部存储的其他存储空间(不包括0x34180000开始的FSBL代码区)可以用来存放Application的代码,空间很大,在这种分配模式下,FSBL和Application的代码量可以达到2MB。

4、就地执行

第三种FSBL的启动模式,FSBL+XiP(Execute in Place),顾名思义:就地执行。

与前一种方法对比,FSBL+XiP不再将外部Flash的App代码复制到内部Flash中,而是在FSBL执行后将程序指针设置为外部Flash中的APP代码中的第一条开始执行。当然这里是否能在外部Flash中存放多份代码,多份执行这里有待尝试。

由于博主暂时没试过这个功能,这里就不做过多赘述(博主需要仔细研究一下)

5、总结

总而言之,FSBL的作用主要是负责引导程序,用户决定系统如何启动。其通过密码学算法校验应用程序的完整性和合法性,防止恶意代码或篡改后的固件运行。STM32在代码安全性中真的花了很大的功夫,不够博主在代码安全性方面真的概念不多,因此就只点一下。

应用FSBL之后可以应该实现引导程序的多样化并且有很多应用场景,例如无线升级之后,FSBL可以检测代码是否进行了升级决定启动方式,以及可以设置两份代码区,当主要代码损坏之后运行备份代码区等等功能。

主程序超出内部Flash容量时,FSBL负责将代码从外部存储器加载到RAM中执行。

所以依据这些特性将FSBL理解足够深透的话应该可以实现很多很棒的功能,例如双系统(裸机+RTOS)类似当电脑装了双系统之后上机的引导程序那样子。

或者实现业务代码和启动逻辑的分离,修改FSBL而不影响主代码的内容。

当然更多的内容和使用方法还有待继续探索!

相关推荐