痞子衡嵌入式:使能i.MXRT1050,1060 Hab签名或加密启动时App链接在片内SRAM的限制
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是使能i.MXRT1050, 1060 Hab签名或加密启动时App链接在片内SRAM的限制。
最近有客户反馈,在 RT1060 上测试 Non-XIP 程序启动,如果程序体部分链接进 0x20280000 地址之后的片内 OCRAM 区域(这部分是由 FlexRAM 分配出来的,默认 256KB)且在芯片 HAB 使能时(即包含验签流程)会启动失败,但是如果不使能 HAB,则启动正常。
这个问题其实是芯片 BootROM 里的特殊限制,并且这个特殊限制只在 i.MXRT1xxx 家族最早期的两颗型号 RT1050/1060 上存在,其余型号没有这个限制。今天痞子衡就和大家聊聊这个话题:
一、Non-XIP App一般链接限制
我们先打开 SDK 里最经典的工程 \SDK_2_14_0_MIMXRT1060-EVKB\boards\evkbmimxrt1060\demo_apps\hello_world\iar,工程默认包含了 6 种 build(其实对应了工程目录下的 6 个链接文件):
痞子衡做了一个表格,对比了这 6 个不同 Build 的差异,本质上就是程序 RO 和 RW 段链接位置的不同导致芯片 BootROM 启动程序时需要区别对待,XIP 程序不需要搬移,Non-XIP 程序需要搬移到目标地址(片内 SRAM 或者片外 RAM)。
我们知道 i.MX RT 系列程序要想离线启动都是需要加 《IVT 启动头》 的,因为 IVT 等启动头的存在,程序中断向量表起始位置需要做一点牺牲(让出最前面的位置给启动头),这也是下表中有些 build 不能被 BootROM 加载启动的原因,因为没有让出最前面的位置。
| Build名 | Readonly位置 | 中断向量表首地址 | Readwrite位置 | 是否XIP | BootROM能否加载启动 |
|---|---|---|---|---|---|
| debug/release | 片内ITCM | 0x00000000 | 片内DTCM | 否 | 否 |
| flexspi_nor_debug/release | 片外NOR Flash | 0x60002000 | 片内DTCM | 是 | 能 |
| sdram_debug/release | 片内ITCM | 0x00000000 | 片外SDRAM | 否 | 否 |
| flexspi_nor_sdram_debug/release | 片外NOR Flash | 0x60002000 | 片外SDRAM | 是 | 能 |
| sdram_txt_debug/release | 片外SDRAM | 0x80000000 | 片内OCRAM | 否 | 否 |
| ram_0x1400_debug/release | 片内ITCM | 0x00001400 | 片内DTCM | 否 | 能 |
对于串行 NOR Flash 的 XIP build,程序中断向量表在 SDK 里默认是在偏移 0x2000 之后开始存放的(即 0x60002000),这个偏移只是一个推荐最佳值,但并不是定死的,实际上偏移最小可以是 0x1400,最大不设限(视 Flash 容量而定),这里的设计很灵活,因为这个偏移地址会被存在固定偏移 0x1000 开始的 IVT 启动头里,所以 BootROM 总能找到程序位置去跳转执行。
对于 Non-XIP build,其在 SDK 里没法直接包含启动头,所以我们需要借助恩智浦官方 MCUXpresso Secure Privisioning Tool 或者痞子衡设计的 MCUBootUtility 工具来一键添加相应启动头去下载到启动设备里。开发者只需要做一件事,就是编出一个程序可执行文件(elf/srec/hex/bin)给工具即可,这里唯一需要关心的就是偏移地址问题。跟 XIP build 不同的是,原理上 Non-XIP 程序在目标地址(片内 SRAM 或者片外 RAM)链接时并不需要让出最前面的位置,毕竟启动头是存在非易失性启动设备里的,但是 BootROM 在搬移程序时总是会连着启动头一起搬移到目标地址,这是 BootROM 的程序设计限制,所以 Non-XIP 程序也不得不让出目标地址的最前面部分。对于 NOR 型启动设备,最小偏移是 0x1400;对于 NAND 型启动设备最小偏移是 0x800;痞子衡建议一律按 SDK 里为 XIP build 推荐的统一 0x2000 偏移最省事。基于此我们在修改 IAR 相应链接文件时 m_interrupts_start 值可按如下修改:
| 链接在片内ITCM | 链接在片内DTCM | 链接在片外PSRAM/HyperRAM | 链接在片外SDRAM |
|---|---|---|---|
| 0x00002000 | 0x20002000 | 0x60002000/0x70002000 | 0x80002000 |
上表中痞子衡特意没有列出片内 OCRAM 的情况,原因是这里有点特殊,因为 OCRAM 的前 32KB (0x20200000 - 0x20207FFF)被 BootROM 用作 RW 区了。对于 Non-XIP 程序,RO 段不能链接在这里,否则 BootROM 在做程序拷贝时会冲掉自己的 RW 区导致自己程序异常,自顾都不暇还如何能正常加载用户程序。所以对于 OCRAM 的情况,我们在链接程序时要减去前 32KB 空间再按上面的经验做偏移,所以 m_interrupts_start 应设为 0x2020A000。
- Note: 不同 i.MX RT 型号 BootROM 在 OCRAM 里占用的起始位置和空间大小可能是不同的,具体需查看芯片参考手册 System Boot 章节。
二、Non-XIP App在使能HAB后的链接限制
上一小节里,我们总结出了 Non-XIP 程序的两个一般链接限制:让出最前面给启动头的位置,让出 BootROM 占据的 OCRAM 空间。这对于不签名的程序启动来说就够了,但是如果使能了 HAB 之后,必须加验签过程,情况有所变化了。痞子衡这里就不卖关子了,直接给出如下 HAB 识别区域表,这表里 RT1050/RT1060 一些空间标了红,原因是它们的 BootROM 分别对最大 TCM 的后 64KB 和最大 OCRAM 后 512KB 空间有所保留,没有全部开放给 HAB 验签。其余 RT 型号,是否使能 HAB 对程序链接无影响。
这个限制对于默认 FlexRAM 配置的 RT1050 倒是没有影响,但是 RT1060 的默认 256KB FlexRAM - OCRAM 0x20280000 - 0x202BFFFF 空间从此就不能放含签名的 Non-XIP 程序了。
| 芯片 | 片内SRAM区域 | BootROM占用区 | HAB识别区域 |
|---|---|---|---|
| i.MXRT117x M7 | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 2MB (0x20200000 - 0x203FFFFF) |
OCRAM 48KB(0x20240000 - 0x2024BFFF) | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 256KB(0x20200000 - 0x2023FFFF) OCRAM 1744KB(0x2024C000 - 0x203FFFFF) |
| i.MXRT116x M7 | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 1MB (0x20200000 - 0x202FFFFF) |
OCRAM 48KB(0x20240000 - 0x2024BFFF) | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 256KB(0x20200000 - 0x2023FFFF) OCRAM 720KB(0x2024C000 - 0x202FFFFF) |
| i.MXRT106x | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 1MB (0x20200000 - 0x202FFFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 480KB(0x20208000 - 0x2027FFFF) |
| i.MXRT105x | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 512KB(0x20200000 - 0x2027FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 448KB (0x00000000 - 0x0006FFFF) DTCM 448KB (0x20000000 - 0x2006FFFF) OCRAM 480KB(0x20208000 - 0x2027FFFF) |
| i.MXRT104x | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 512KB(0x20200000 - 0x2027FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 480KB (0x00000000 - 0x00077FFF) DTCM 480KB (0x20000000 - 0x20077FFF) OCRAM 480KB(0x20208000 - 0x2027FFFF) |
| i.MXRT102x | ITCM 256KB (0x00000000 - 0x0003FFFF) DTCM 256KB (0x20000000 - 0x2003FFFF) OCRAM 256KB(0x20200000 - 0x2023FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 224KB (0x00000000 - 0x00037FFF) DTCM 224KB (0x20000000 - 0x20037FFF) OCRAM 224KB(0x20208000 - 0x2023FFFF) |
| i.MXRT1015 | ITCM 128KB (0x00000000 - 0x0001FFFF) DTCM 128KB (0x20000000 - 0x2001FFFF) OCRAM 128KB(0x20200000 - 0x2021FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 96KB (0x00000000 - 0x00017FFF) DTCM 96KB (0x20000000 - 0x20017FFF) OCRAM 96KB (0x20208000 - 0x2021FFFF) |
| i.MXRT1011 | ITCM 128KB (0x00000000 - 0x0001FFFF) DTCM 128KB (0x20000000 - 0x2001FFFF) OCRAM 128KB(0x20200000 - 0x2021FFFF) |
OCRAM 22KB (0x20200000 - 0x202057FF) | ITCM 96KB (0x00000000 - 0x00017FFF) DTCM 96KB (0x20000000 - 0x20017FFF) OCRAM 106KB(0x20205800 - 0x2021FFFF) |
至此,使能i.MXRT1050,1060 Hab签名或加密启动时App链接在片内SRAM的限制痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:使能i.MXRT1050,1060 Hab签名或加密启动时App链接在片内SRAM的限制的更多相关文章
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(5)- 再聊eFUSE及其烧写方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的eFUSE. 在i.MXRT启动系列第二篇文章 Boot配置(BOOT Pin, eFUSE) 里痞子 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(6)- Bootable image格式与加载(elftosb/.bd)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Bootable image格式与加载过程. 在i.MXRT启动系列第三篇文章 Serial Down ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(3)- Serial Downloader模式(sdphost/MfgTool)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial Downloader模式. 在上一篇文章 Boot配置(BOOT Pin, eFUSE) ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(8)- 从Raw NAND启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Raw NAND启动. 前面铺垫了七篇启动系列文章,终于该讲具体Boot Device了,我们知道i. ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(9)- 从Parallel NOR启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Parallel NOR启动. 上一篇讲i.MXRT从Raw NAND启动的文章 从Raw NAND启 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(4)- Flashloader初体验(blhost)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Flashloader. 在上一篇文章 Serial Downloader模式(sdphost, mf ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(13)- 从Serial(1-bit SPI) EEPROM/NOR恢复启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial EEPROM/NOR恢复启动. 在前几篇里痞子衡介绍的Boot Device都属于主动启 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(1)- Boot简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的BootROM功能简介. 截止目前为止i.MX RT系列已公布的芯片有三款i.MXRT105x, i. ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRT Bo ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU启动那些事(1)- Boot简介
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的BootROM功能简介. 截止目前为止i.MX RTyyyy系列已公布的芯片有三款i.MXRT ...
随机推荐
- 【Azure 应用服务】Python3.7项目在引用pandas 模块后,部署报错
问题描述 参考"快速入门:在 Linux 上的 Azure 应用服务中创建 Python 应用" 文档,在App Service For Linux环境中部署Python应用,在添 ...
- 【Azure 事件中心】Spring Boot 集成 Event Hub(azure-spring-cloud-stream-binder-eventhubs)指定Partition Key有异常消息
问题描述 在Spring Boot应用中集成Event Hub,发送消息时指定Partition Key,日志中发现异常: 应用使用Event Hub版本为 <dependency> &l ...
- vivo 在离线混部探索与实践
作者:来自 vivo 互联网服务器团队 本文根据甘青.黄荣杰老师在"2023 vivo开发者大会"现场演讲内容整理而成. 伴随 vivo 互联网业务的高速发展,数据中心的规模不断扩 ...
- mysql-批量修改表的主键id,修改成联合主键
1.sql脚本 一. 通过sql脚本,查出所有表的功能,并编写插入修改的联合主键,sql select concat('ALTER table ', TABLE_NAME, ' DROP PRIMAR ...
- Java 关于变量的赋值
1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...
- 2、hystrix原理
hystrix熔断机制 1.隔离机制 线程隔离: Hystrix在用户请求和服务之间加入了线程池. Hystrix为每个依赖调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队.加速 ...
- AP渗透测试学习
1.测试指标 2.测试环境 SDK: Java JDK ,Android SDK 工具: 7zip dex2jar jd-gui apktool activity 劫持工具 3. ...
- 在vue3中使用openlayers3实现track轨迹动画
网上太多资料代码,抄来抄去,而且版本也是v5.x版本的,部分API已经弃用 基础知识不多说,直接讲重点 三个关键变量 // 记录开始动画的时间 const startTime = ref(0); // ...
- Lock wait timeout exceeded; try restarting transaction-Mysql报错
一.问题由来 现在在做一个小程序的后台,使用Java写的,数据库使用的Mysql,之前一直调试的时候都好好的,今天在调试的时候突然就报一个错: ### Error updating database. ...
- DatePicker 日期选择器 split-panels 数组的时候,清空这个费劲啊,最后走的后门
这里的核心问题就是验证的时候value值不对,总是初始化的值,不论怎么设置,开始觉得是数组指针的问题,最后也不行,null也不行,组件的props都已经是null了,验证就是这么神奇,最后把this放 ...