痞子衡嵌入式:使能i.MXRT1050,1060 Hab簽名或加密啟動時App連結在片內SRAM的限制

痞子衡發表於2024-04-11

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是使能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主頁知乎主頁微信公眾號 平臺上。

微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

相關文章