作為一個(gè)嵌入式軟件攻城獅,提起庫(kù)首先會(huì)想到靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。靜態(tài)庫(kù)一般以.a為后綴,動(dòng)態(tài)庫(kù)以.so為后綴(Win系統(tǒng).DLL)。
而作為一個(gè)單片機(jī)軟件攻城獅,也會(huì)經(jīng)常用到各種靜態(tài)庫(kù),常見的C庫(kù)有stdio,stdlib,string,time等,第三方庫(kù)也有CMSIS_DSP_Library,mbedtls,60730等等。為什么要使用這些庫(kù)呢?個(gè)人認(rèn)為可能有以下幾個(gè)原因:
系統(tǒng)解耦,可以減少軟件模塊之間的耦合,使軟件結(jié)構(gòu)更清晰。
加速編譯,有些庫(kù)源碼有非常多的源文件,如果使用源碼編譯會(huì)大大增加編譯時(shí)間。
保護(hù)知識(shí)產(chǎn)權(quán),限定產(chǎn)品的使用范圍。比如NXP提供的電機(jī)算法庫(kù)rtcesl當(dāng)然希望它運(yùn)行在自己品牌的MCU。
MCU從產(chǎn)品實(shí)用角度上看,也是有動(dòng)態(tài)庫(kù)的需求,比如下面幾種場(chǎng)景:
有些產(chǎn)品形態(tài)要求MCU的固件分為安全域和非安全域,安全域的邏輯一旦經(jīng)過(guò)認(rèn)證就無(wú)法進(jìn)行升級(jí),而非安全域的邏輯可以通過(guò)bootloader進(jìn)行遠(yuǎn)程或本地的升級(jí)。比如新規(guī)電表,計(jì)量部分屬于安全域不可更新,而其他固件則可以進(jìn)行更新
有些軟件/算法公司并不提供實(shí)際的硬件產(chǎn)品,和終端客戶的合作模式如果按件收費(fèi),除非每個(gè)產(chǎn)品必須聯(lián)網(wǎng)認(rèn)證,就像我們所用的Windows系統(tǒng)激活,否則很難把控。比較好的做法是,將算法編譯成二進(jìn)制燒入芯片中,向終端客戶提供芯片。
有些產(chǎn)品經(jīng)常需要更新固件,受限于通訊速率,F(xiàn)lash大小的問(wèn)題,希望可更新的固件越小越好。比如內(nèi)置藍(lán)牙的MCU,其協(xié)議棧往往在100KB左右,如果通過(guò)源碼或者靜態(tài)庫(kù)的方式編譯,則升級(jí)的時(shí)候就必須將協(xié)議棧也一并升級(jí),即使協(xié)議棧本身沒有任何修改,由于升級(jí)的固件比較大,所需要的更新時(shí)間也會(huì)非常長(zhǎng)。如果通過(guò)動(dòng)態(tài)庫(kù)的方式提供協(xié)議棧,就沒有這個(gè)問(wèn)題。同時(shí),如果客戶要求產(chǎn)品的固件能回退,則Flash必須能放兩份固件,如果應(yīng)用代碼超過(guò)20K,則最終固件很容易超過(guò)128K(APP+BLE),如果使用靜態(tài)庫(kù),則選型時(shí)必須使用超過(guò)256K的產(chǎn)品(APP+BLE)x2,而動(dòng)態(tài)庫(kù)則可以使用256K以內(nèi)的產(chǎn)品(APPx2+BLE)。用過(guò)Nordic藍(lán)牙MCU的應(yīng)該都懂。
今天我們就專門研究下如何在MCU上實(shí)現(xiàn)動(dòng)態(tài)庫(kù)的制作和加載。
制作動(dòng)態(tài)庫(kù)
首先我們先回憶下如何制作靜態(tài)庫(kù),第三方的或者自己寫的靜態(tài)庫(kù),一般由三部分組成:
在MCU中制作的動(dòng)態(tài)庫(kù)則需要如下幾部分內(nèi)容:
至于具體如何實(shí)現(xiàn),現(xiàn)在以之前介紹的開源PLC為例:
規(guī)劃內(nèi)存,將MCU內(nèi)部的Flash/RAM分出一部分留給庫(kù),具體做法需要修改鏈接文件中的相關(guān)地址
定義函數(shù)指針列表結(jié)構(gòu)體,用于提供給用戶程序調(diào)用:
初始化結(jié)構(gòu)體,并實(shí)現(xiàn)函數(shù)原型:
修改鏈接文件,將函數(shù)指針列表放到固定地址
編譯并下載到MCU中
加載動(dòng)態(tài)庫(kù)
生成動(dòng)態(tài)庫(kù)后,用戶只需要知道函數(shù)指針列表的地址和結(jié)構(gòu)體列表即可。使用過(guò)程如下:
在用戶工程中定義相同的結(jié)構(gòu)體,并從固定地址中加載到
通過(guò)函數(shù)指針執(zhí)行相應(yīng)代碼即可
擴(kuò)展知識(shí)
針對(duì)動(dòng)態(tài)庫(kù)的應(yīng)用場(chǎng)景2,簡(jiǎn)單的賣芯片也只是防君子不防小人,因?yàn)榻K端客戶可以通過(guò)JTAG/SWD把動(dòng)態(tài)庫(kù)讀出來(lái),有些芯片雖然支持禁用JTAG/SWD使能ISP的方式下載,但用戶還是可以通過(guò)指針+地址的方式將庫(kù)從芯片中讀取出來(lái),之后找芯片原廠克隆,針對(duì)這種攻擊,普通的MCU往往是無(wú)力應(yīng)付的,大部分的軟件/算法公司是通過(guò)綁定加密芯片的方式來(lái)進(jìn)行保護(hù),但是除非加密芯片中有算法邏輯,否則這種保護(hù)也是徒勞的,因?yàn)椴还苁莿?dòng)態(tài)庫(kù),還是靜態(tài)庫(kù),攻擊者都可以通過(guò)反匯編看到關(guān)鍵的跳轉(zhuǎn)點(diǎn),從而bypass驗(yàn)證過(guò)程。
難道真的就沒有更好的防守么?目前知道有兩種方案:
NXP Kinetis系列產(chǎn)品在Flash中添加了FAC(Flash Access Control)功能,可以保證在可配置區(qū)域內(nèi)只能被執(zhí)行,而無(wú)法通過(guò)指針?lè)绞剑?a href="http://www.wenjunhu.com/tags/dma/" target="_blank">DMA,JTAG/SWD,Ezport等接口獲取
ARM Cortex-M33內(nèi)核以及支持了TrustZone,可以將動(dòng)態(tài)庫(kù)放置在Secure區(qū)域,并設(shè)置NSC訪問(wèn)接口,具體做法和FAC類似
審核編輯:郭婷
-
mcu
+關(guān)注
關(guān)注
146文章
17229瀏覽量
351967 -
嵌入式
+關(guān)注
關(guān)注
5088文章
19159瀏覽量
306515
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論