大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是使能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的限制的更多相关文章

  1. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(5)- 再聊eFUSE及其烧写方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的eFUSE. 在i.MXRT启动系列第二篇文章 Boot配置(BOOT Pin, eFUSE) 里痞子 ...

  2. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(6)- Bootable image格式与加载(elftosb/.bd)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Bootable image格式与加载过程. 在i.MXRT启动系列第三篇文章 Serial Down ...

  3. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(3)- Serial Downloader模式(sdphost/MfgTool)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial Downloader模式. 在上一篇文章 Boot配置(BOOT Pin, eFUSE) ...

  4. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(8)- 从Raw NAND启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Raw NAND启动. 前面铺垫了七篇启动系列文章,终于该讲具体Boot Device了,我们知道i. ...

  5. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(9)- 从Parallel NOR启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Parallel NOR启动. 上一篇讲i.MXRT从Raw NAND启动的文章 从Raw NAND启 ...

  6. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(4)- Flashloader初体验(blhost)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Flashloader. 在上一篇文章 Serial Downloader模式(sdphost, mf ...

  7. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(13)- 从Serial(1-bit SPI) EEPROM/NOR恢复启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Serial EEPROM/NOR恢复启动. 在前几篇里痞子衡介绍的Boot Device都属于主动启 ...

  8. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(1)- Boot简介

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的BootROM功能简介. 截止目前为止i.MX RT系列已公布的芯片有三款i.MXRT105x, i. ...

  9. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRT Bo ...

  10. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU启动那些事(1)- Boot简介

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的BootROM功能简介. 截止目前为止i.MX RTyyyy系列已公布的芯片有三款i.MXRT ...

随机推荐

  1. 【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动

    什么是 Azure SignalR 服务? Azure SignalR Service 简化了通过 HTTP 向应用程序添加实时 Web 功能的过程. 这种实时功能允许服务将内容更新推送到连接的客户端 ...

  2. 可视化技术在 Nebula Graph 中的应用

    本文首发于 Nebula Graph Community 公众号 本文整理自 #可视化 on Live 主题直播,在本期直播中 3 位可视化嘉宾讲述了他们眼中的可视化,以及他们在可视化项目实践中踩过的 ...

  3. ArrayList学习总结

    1.ArrayList简介[1] ArrayList实现了List接口.ArrayList的方法实现和vector相似,只是线程不安全的. ArrayList的 size.isEmpty.get.se ...

  4. uniapp+定时云函数保活replit

    在replit中运行起来后,如果没有请求,则会在5分钟后关机,所以需要一个进程来定时访问一下,以达到保活的目的.replit是什么?我的理解是:它是一个在线的IDE,前端项目可以直接跑起来,且repl ...

  5. adb monkey 有哪些参数?

    adb monkey 是 Android Debug Bridge (ADB) 工具中的一个命令,用于执行随机事件来对 Android 应用进行压力测试.以下是 adb monkey 命令的一些常用参 ...

  6. Metasploitable3 渗透测试

    1.信息手机阶段 信息收集经常使用的软件 功能也比较强大的Nmap Nmap nmap -p- -sS -sV -n -v --reason --open -oX demon.xml 192.168. ...

  7. sed 资源

    sed教程 菜鸟教程正则 MDN正则 正则测试工具 文本替换 s sed有多种分割符,比如你要替换路径字符串时,使用反斜杠很难看,则可以用 : 或者 _ 或者 | 这三个符号都可作为分隔符. & ...

  8. offline RL | D4RL:最常用的 offline 数据集之一

    pdf:https://arxiv.org/pdf/2004.07219.pdf html:https://ar5iv.labs.arxiv.org/html/2004.07219 GitHub:ht ...

  9. idea branch 分支比较 | git 查看分支命令 `git branch -vv`

    git 查看分支命令 git branch -vv

  10. iView 表单验证 如果prop字段和表单里的字段对不上,会触发校验,提示错误信息

    iView 表单验证 如果prop字段和表单里的字段对不上,会触发校验,提示错误信息 原因: 在某些情况,没有id,只有文本的时候,需要返显文本,直接用input显示文本,就会出现,触发数据校验的问题 ...