你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

X-Cube-SBSFU 使用技巧(之二)——与应用集成

[复制链接]
STMCU小助手 发布时间:2022-8-10 08:23
1. 引言
安全启动与安全更新是嵌入式设备的基本安全要求之一:安全启动提供信任根,保证每次设备启动运行的应用程序的完整性与合法性;安全更新则在固件升级环节避免系统软件被恶意修改或替换。
为了方便客户在其嵌入式设备的设计中更加容易地集成安全启动和安全更新功能,STM32 提供了相关的参考实现并支持众多 STM32 MCU 系列。其中 X-CUBE-SBSFU 是针对 Cortex V6/V7M 内核的 STM32 MCU 产品的参考方案。
在 X-CUBE-SBSFU 使用技巧的第一篇,我们对软件包及其软件架构等进行了介绍,读者对这个软件包有了初步认识。在这一篇我们将介绍 SBSFU 和用户应用程序集成相关的内容。
2. 应用程序链接文件
2.1. Flash
通常一个不带有安全启动或者 bootloader 的应用程序会以内部 Flash 的基地址作为该应用程序对应 vector table 的起始地址,并可以运行于整个内部 Flash 空间。当在应用中集成 SBSFU 参考实现的时候,需要调整应用程序在 Flash 中的占位。
在 X-CUBE-SBSFU 使用技巧的第一篇中我们介绍了以 X-CUBE-SBSFU 为框架的安全启动方案的存储器地址空间布局,单镜像模式、双镜像模式、内部+外部 Flash 模式等等,可能会有不尽相同的空间布局。但是对于应用程序来说,只需要关注其中的 Active Slot 部分,应用程序在 Flash 中的放置位置由 Memory Map 中的 Active Slot 区域决定,如图 1 所示。

J1UQ16YVX``Y~OII]YZJDFC.png

Active Slot 的地址在 SBSFU 参考实现的 Linker_Common 目录下的 mapping_fwimg.x文件中有定义。那么修改应用 Linker file 的方式有两种,一种方式是根据 mapping_fw.x 中 的 Active slot 定义直接在应用程序中 hard code 相关地址。另一种是在应用的 Linker file中引用 mapping_fw.x 文件,并使用其中的定义来指定 vector table、ROM 区域的起止地址等,这种方式的好处是,应用程序与 SBSFU 引用相同的 linker 定义文件,当需要做地址空间调整的时候只需要统一修改,以避免地址定义不一致的问题。

注意
• 应用程序的实际起始地址并非是 Active Slot 的开始地址,因为当应用程序位于内部Flash 的时候,Active Slot 包含固件头(header)信息和固件本身,所以应用程序vector table 的实际起始地址应该是 Active Slot 开始地址(SLOT_Active_1_start)+固件头偏移量。固件头偏移量的大小在不同系列上可能不同,例如 L4 系列的偏移量为 512字节,而 H7 系列的偏移量大小为 1024 字节,所以这个偏移量需要参考对应系列的SBSFU 实现中使用的具体定义(例如 UserApp 示例工程的 linker file 中的定义)。如果是应用程序运行于外部 Flash 的情况,Active Slot Header 依旧会位于内部 Flash, 而 Active Slot 则在外部 Flash,此时,Active Slot 与 Header 没有重叠部分,外部Flash 上的应用程序起始地址就是 Active Slot 的开始地址。


8Y8HD1EB}G{BC1PT3CM8AB4.png

• 如果应用程序中需要预留一部分 Flash 空间作为 NVM 存储区使用,那么这部分应当与现有 SBSFU 方案定义的几个区域隔开,必须放在 Active Slot,Download Slot,Swap区以及 SBSFU 区以外的空间。如果 NVM 区放在 Active slot 区以内,则应用运行时一 旦修改了 Active Slot 区内的 NVM 数据,将会导致下次启动时待运行的当前版本应用程序无法通过安全启动校验从而启动失败。如果作为参考基础的 SBSFU 示例中的mapping定义已经使用了所有内部 Flash 空间,则需要调整 Active Slot,Download Slot 的地址和大小,swap 区可能也需要跟着修改。
• 当 vector table 起始地址在 linker file 中修改时,systemInit 函数中的 VTOR 应当相应修改。可以像参考代码那样,通过引用“__vetor_table”的方式设置 VTOR,例如


  1. #if defined(__ICCARM__)
  2. extern uint32_t __vector_table;
  3. #define INTVECT_START ((uint32_t)& __vector_table)
  4. #elif defined(__CC_ARM)
  5. extern void * __Vectors;
  6. #define INTVECT_START ((uint32_t) & __Vectors)
  7. #elif defined(__GNUC__)
  8. extern void * g_pfnVectors;
  9. #define INTVECT_START ((uint32_t)& g_pfnVectors)
  10. #endif
  11. void SystemInit (void) {

  12. SCB->VTOR = INTVECT_START;

  13. }
复制代码

完整版请查看:附件

J1UQ16YVX``Y~OII]YZJDFC.png
收藏 评论0 发布时间:2022-8-10 08:23

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版