【導(dǎo)讀】工業(yè)與家電產(chǎn)品通過(guò) ClassB 功能安全認(rèn)證時(shí),常面臨一個(gè)核心痛點(diǎn):同平臺(tái)多子系列產(chǎn)品,僅應(yīng)用代碼不同、安全代碼完全一致,卻需重復(fù)認(rèn)證,時(shí)間與成本居高不下。為解決該問(wèn)題,行業(yè)通用方案是安全代碼與應(yīng)用代碼物理分區(qū),確保安全代碼二進(jìn)制不變,一份認(rèn)證覆蓋全系列。本文基于 ST 官方 LAT1630 文檔,結(jié)合 STM32G081B+MDK 實(shí)操,拆解分區(qū)原理、分區(qū)設(shè)計(jì)、實(shí)操步驟與調(diào)試技巧,幫你高效落地 ClassB 代碼分區(qū)。
資料獲取:經(jīng)驗(yàn)分享 | LAT1630 ClassB功能安全認(rèn)證代碼與應(yīng)用代碼進(jìn)行分區(qū)的實(shí)現(xiàn)要點(diǎn)
1. 痛點(diǎn)直擊:為何必須做代碼分區(qū)
Class 認(rèn)證核心是安全代碼二進(jìn)制不可變,應(yīng)用代碼修改不能影響安全代碼。但實(shí)際開(kāi)發(fā)中,應(yīng)用代碼變動(dòng)會(huì)觸發(fā)連鎖問(wèn)題:
函數(shù)地址漂移:安全代碼調(diào)用的應(yīng)用函數(shù),地址隨應(yīng)用代碼修改而變化,導(dǎo)致安全代碼二進(jìn)制改變;
全局變量重分配:安全訪問(wèn)的全局變量,地址重新分配,破壞安全邏輯;
隱式調(diào)用干擾:編譯器生成的 switch 跳轉(zhuǎn)等隱式調(diào)用,地址隨應(yīng)用代碼變動(dòng),引發(fā)安全代碼異常。
分區(qū)設(shè)計(jì)的核心目標(biāo),就是隔離安全代碼、固定依賴地址、隔絕應(yīng)用代碼影響,實(shí)現(xiàn) “安全代碼一次認(rèn)證,全系列復(fù)用”。
2. 核心原理:三區(qū)兩區(qū)分區(qū)架構(gòu)
要實(shí)現(xiàn)代碼隔離,需對(duì)ROM(代碼區(qū))分三區(qū)、RAM(變量區(qū))分兩區(qū),精準(zhǔn)隔離安全、過(guò)渡、應(yīng)用代碼,確保安全代碼獨(dú)立性。
2.1 ROM 三區(qū)劃分
SECTION_CLASSB:存放 ClassB 安全代碼(如 stm32xx_STL 系列自檢代碼),只讀不可修改,認(rèn)證核心區(qū)域;
SECTION_WRAPPER:過(guò)渡封裝區(qū),存放安全代碼調(diào)用的函數(shù),地址固定不變,含穩(wěn)定 HAL 庫(kù)函數(shù)、應(yīng)用封裝函數(shù);
SECTION_APP:普通應(yīng)用代碼區(qū),可自由修改,不被安全代碼直接訪問(wèn),變動(dòng)無(wú)影響。
2.2 RAM 兩區(qū)劃分
固定地址 RAM:存放安全代碼訪問(wèn)的全局 / 靜態(tài)變量,地址鎖定不變;
可變地址 RAM:存放普通應(yīng)用變量,可動(dòng)態(tài)分配,不影響安全邏輯。
2.3 關(guān)鍵隔離邏輯
安全代碼僅調(diào)用 Wrapper 區(qū)函數(shù)、訪問(wèn)固定 RAM 變量,完全隔絕 App 區(qū);App 代碼修改僅影響自身,安全代碼二進(jìn)制100% 不變,滿足 Class 認(rèn)證要求。
3. 實(shí)操落地:MDK+STM32G081B 分區(qū)步驟
以 STM32Cube_FW_ClassB_V2.3.0、MDK 5.41.0 為例,分步實(shí)現(xiàn)分區(qū)配置。
3.1 代碼分類(lèi)整理
將工程文件按功能分組:
ClassB 代碼:stm32g0xx_STLmain.c、stm32g0xx_STLxxx.c(自檢核心代碼);
Wrapper 代碼:安全調(diào)用的 HAL 庫(kù)(CRC、WDG、RCC 驅(qū)動(dòng))、封裝函數(shù);
App 代碼:用戶業(yè)務(wù)邏輯、無(wú)關(guān)驅(qū)動(dòng)代碼。
3.2 Scatter 文件分區(qū)配置
通過(guò) MDK 散列文件,強(qiáng)制代碼 / 變量分區(qū):
ROM 分區(qū):指定 SECTION_CLASSB、SECTION_WRAPPER、SECTION_APP 的起始地址與范圍;
RAM 分區(qū):劃分固定地址區(qū)與可變區(qū),綁定安全變量。
核心配置要點(diǎn):
SECTION_CLASSB 設(shè)為獨(dú)立連續(xù)地址,無(wú)重疊;
SECTION_WRAPPER 鎖定起始地址,禁止重定向;
安全全局變量強(qiáng)制分配到固定 RAM 區(qū)。
3.3 Wrapper 封裝技巧
安全代碼需調(diào)用可變應(yīng)用函數(shù)時(shí),必須做封裝:
原始函數(shù)(如 STL_InitClock_Xcross_Measurement)放在 App 區(qū);
新增封裝函數(shù)(STL_InitClock_Xcross_Measurement_Wrapper),內(nèi)部調(diào)用原始函數(shù);
封裝函數(shù)放入 Wrapper 區(qū),安全代碼僅調(diào)用封裝函數(shù);
應(yīng)用代碼修改原始函數(shù),Wrapper 地址不變,安全代碼不受影響。
3.4 編譯器避隱式調(diào)用
安全代碼中 switch 語(yǔ)句會(huì)生成
ARM_common_switch8
隱式調(diào)用,地址易漂移,需添加編譯選項(xiàng):
對(duì) ClassB 代碼文件(如 stm32xx_STLmain.c),添加
--no_branch_tables
;
禁用編譯器生成分支跳轉(zhuǎn)表,杜絕隱式調(diào)用,保證安全代碼二進(jìn)制穩(wěn)定。
4. 調(diào)試驗(yàn)證:確保安全代碼不變
分區(qū)配置后,需驗(yàn)證安全代碼二進(jìn)制一致性,避免配置疏漏。
4.1 fromelf 匯編對(duì)比
用 MDK 自帶 from 工具,將 axf 執(zhí)行文件轉(zhuǎn)為匯編:
微信截圖_20260521174100_20260521174109_521.png)
對(duì)比應(yīng)用代碼修改前后的匯編文件,SECTION_CLASSB 段完全一致,即為合格。
4.2 宏測(cè)試驗(yàn)證
開(kāi)啟 / 關(guān)閉應(yīng)用代碼宏(如__VERSION_UPDATE),編譯兩個(gè)版本:
對(duì)比二進(jìn)制文件,安全代碼區(qū)無(wú)差異;
應(yīng)用代碼區(qū)正常變化,驗(yàn)證隔離效果。
ClassB 代碼分區(qū)的核心是三區(qū)兩隔離:ROM 分 ClassB、Wrapper、App,RAM 分固定區(qū)、可變區(qū),配合封裝設(shè)計(jì)與編譯器優(yōu)化,徹底隔絕應(yīng)用代碼對(duì)安全代碼的影響。
該方案已通過(guò) ST 官方驗(yàn)證,適配 STM32 全系列 ClassB 認(rèn)證項(xiàng)目,可大幅降低多子系列認(rèn)證成本,縮短產(chǎn)品上市周期。實(shí)操時(shí)重點(diǎn)關(guān)注 Scatter 配置、Wrapper 封裝、隱式調(diào)用規(guī)避,即可高效落地分區(qū)設(shè)計(jì)。



