痞子衡嵌入式:使能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主頁知乎主頁微信公衆號 平臺上。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章