首页 > 其他分享 >痞子衡嵌入式:使能i.MXRT1050,1060 Hab签名或加密启动时App链接在片内SRAM的限制

痞子衡嵌入式:使能i.MXRT1050,1060 Hab签名或加密启动时App链接在片内SRAM的限制

时间:2024-04-11 23:22:51浏览次数:30  
标签:使能 ITCM DTCM 1060 Hab 0x00000000 512KB 0x20200000 OCRAM


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是使能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主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

标签:使能,ITCM,DTCM,1060,Hab,0x00000000,512KB,0x20200000,OCRAM
From: https://www.cnblogs.com/henjay724/p/18111727

相关文章

  • :error=>"Elasticsearch Unreachable: [http://192.168.100.44:9200/][Manticore::Soc
    [2024-04-10T14:02:09,005][WARN][logstash.outputs.elasticsearch]AttemptedtoresurrectconnectiontodeadESinstance,butgotanerror.{:url=>"http://192.168.100.44:9200/",:error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool......
  • MUR1060D-ASEMI快恢复二极管MUR1060D
    编辑:llMUR1060D-ASEMI快恢复二极管MUR1060D型号:MUR1060D品牌:ASEMI封装:TO-252最大平均正向电流(IF):10A最大循环峰值反向电压(VRRM):600V最大正向电压(VF):1.30V工作温度:-55°C~150°C反向恢复时间:35ns芯片个数:1芯片尺寸:72mil引脚数量:4正向浪涌电流(IFMS):30A包装方式:50/管1000/......
  • 【洛谷】P1060 开心的金明
    P1049装箱问题确认所需算法题目链接:P1060开心的金明这题是一道01背包问题,如果你还不知道什么是背包问题,那么请看我的背包问题学习笔记思路这道题的输入有一点点奇怪,v[i]=2~n+1行的第一个数*第二个数。其他的稍微抽象一点就可以变为标准的01背包问题了。关于状态转移方程......
  • 系统盘扩容01-安装统信UOS桌面操作系统1060启用系统扩容
    原文链接:系统盘扩容01-安装统信UOS桌面操作系统1060启用系统扩容Hello,大家好啊!今天,我非常高兴地为大家开启一个新的系列文章——在统信UOS上扩容系统盘。随着我们对电脑的日常使用,系统盘的空间往往会逐渐变得不够用,特别是在安装了大量软件或数据积累后。为了改善这一状况,扩......
  • C. Ehab and Path-etic MEXs
    原题链接题解1.任意两条边在且仅在一条链上2.一定存在一条链使得其包含边权为0,1的边,这个时候我们要让2不在01所在的链上,即如下情况:此时01所在链答案为2,02所在链答案为一3.如果树退化成了链,那么不管怎么构造都一样由此得出,找出这样的T型节点,即含有三条边的节点,然后在它上......
  • 英码嵌入式AI ISP视频处理模组SOM928,使能全场景更智能、更清晰!
    随着视觉产业的飞速发展,图像分辨率获得持续提升,图像效果不断优化,但在暗光、逆光、运动等场景下输出高质量图像仍然是行业公认的难点。因此,能满足高清视觉感知应用的产品,在无人机、智能摄像机、高端运动相机、智能医疗视觉、智能驾驶等行业有着极大市场需求,英码嵌入式在视频图像技......
  • LY1060 [ 20230203 CQYC模拟赛IV T1 ] 放进去
    题意一共有\(n\)个物品,每个物品有\(m\)种种类。每个物品的每个种类的代价为\(a_{i,j}\)选择一种种类需要先支付\(b_i\)的代价。\(n\le1e5,m\le25\)求最小的代价使得能够选择\(n\)种物品。Sol考场上竟然没做出来。。。冲到最后20min交了发模拟退火。。。集......
  • Atomic Habits
    from「TheSurprisingPowerofAtomicHabits」良い習慣も、悪い習慣も、時間に従って、倍の効果にできる1.1の365乗は37.780.99の365乗は00.03良い習慣を努力して続く間、linearな成果を見たいが、よくあるのは、見えない。そのため、失望になりやすい事実は、「"cr......
  • CF935D Fafa and Ancient Alphabet 题解
    讲一个很暴力的方法(为描述方便,下文\(a\)数组代表\(s1\),\(b\)数组代表\(s2\))。发现假如当前\(a_i\neb_i\),就不需要再向下枚举了,于是拥有了分类讨论的雏形。我们设\(inv\)代表进行到这一步的概率,可分为以下四种情况:\(a_i>0,b_i>0\)。此时假如\(a_i=b_i\),略过;若\(a_i>......
  • Proxmox 7.4 使用vgpu_unlock,为GTX1060开启vGPU支持
    本文在2021年发布的博客《Proxmox5.4使用vgpu_unlock,为GTX1060开启vGPU支持》,介绍了ProxmoxVE5.4上部署vGPUunlock的操作步骤。 后续有发布了在 ProxmoxVE7.x上支持vGPU的博客《Proxmox7.2部署DoraCloud桌面云,支持vGPU》,实现了通过3个脚本完成vGPU的配置。 ......