找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11397|回復(fù): 0
收起左側(cè)

話說STM32的PCROP代碼保護(hù)功能

[復(fù)制鏈接]
ID:98618 發(fā)表于 2016-11-1 00:08 | 顯示全部樓層 |閱讀模式

軟件供應(yīng)商們?cè)谥铝τ陂_發(fā)屬于自己的知識(shí)產(chǎn)權(quán)的軟件產(chǎn)品,尤其是那些中間件產(chǎn)品的同時(shí),如何保護(hù)這些知識(shí)產(chǎn)權(quán)[IP]實(shí)際上也是他們非常關(guān)心和重視的問題;诟黝愇⑻幚砥鞯那度胧疆a(chǎn)品對(duì)IP保護(hù)的要求也日益明顯和迫切。

 

為了滿足對(duì)產(chǎn)品IP保護(hù)的需求,STM32的各系列MCU都提供芯片讀保護(hù)寫保護(hù)。除此之外,目前STM32家族10個(gè)產(chǎn)品線中,除了STM32F1等個(gè)別早期產(chǎn)品線外,還增加了專有代碼讀保護(hù)功能,即Proprietary Code Read Out Protection (PCROP)。

 

? Read Protection(RDP): 對(duì)整個(gè)芯片實(shí)施讀出保護(hù);

? Write Protection: 防止意外的對(duì)存儲(chǔ)器的擦、寫操作;

? PCROP: 針對(duì)指定扇區(qū)進(jìn)行讀寫保護(hù);

 

PCROP為Proprietary code readout protection 的縮寫,是一個(gè)專有代碼讀出保護(hù)的功能。與RDP 對(duì)整片F(xiàn)lash讀保護(hù)不同的是,它只是針對(duì)Flash 的某些特定區(qū)域進(jìn)行代碼的讀寫保護(hù)。它可以被用來保護(hù)一些IP代碼,方便進(jìn)行二次開發(fā)。ST公司的多個(gè)STM32產(chǎn)品系列,比如STM32L1、STM32F4、STM32L4STM32F7、STM32H7等都支持PCROP功能。



**受PCROP保護(hù)的IP代碼可以隨意地被用戶應(yīng)用程序調(diào)用運(yùn)行,同時(shí)又防止外界對(duì)IP代碼的直接讀寫訪問。一咋看這句話理解起來可能有點(diǎn)別扭,稍微琢磨下應(yīng)可反應(yīng)過來。相信不少軟件工程師在開發(fā)中有時(shí)會(huì)用到第三方庫代碼,有些庫代碼是編譯過的lib庫,看不到source code,但你能使用調(diào)用它,有點(diǎn)類似。

 

**寫保護(hù)和PRROP保護(hù)都可以針對(duì)指定的扇區(qū)配置,但是在同一存儲(chǔ)器內(nèi)要么針對(duì)扇區(qū)實(shí)施寫保護(hù),要么針對(duì)扇區(qū)進(jìn)行PCROP保護(hù)。不可以一部分扇區(qū)配置寫保護(hù),另一部分扇區(qū)配置PCROP保護(hù)。


**PCROP區(qū)的代碼也可以調(diào)用PCROP區(qū)外的處于固定地址的函數(shù)。


**受PCROP保護(hù)的區(qū)域是無法使用D-Code 總線進(jìn)行讀訪問的,所以在這片區(qū)域中只允許執(zhí)行指令代碼(通過I-Code 總線取指令),數(shù)據(jù)讀取是被禁止的。因此,受保護(hù)的IP代碼不能訪問存儲(chǔ)于同一塊區(qū)域內(nèi)的關(guān)聯(lián)數(shù)據(jù),比如文字池(literal pools)、分支表(branch tables)以及在執(zhí)行過程中需要通過D-code總線進(jìn)行讀取的常量數(shù)據(jù)。


換言之,受PCROP 保護(hù)的代碼只能是只執(zhí)行的指令代碼,而不包含任何數(shù)據(jù)。因此,我們?cè)诰幾g受PCROP保護(hù)的IP代碼時(shí),必須對(duì)其進(jìn)行相應(yīng)配置,以避免在PRROP區(qū)域生成文字池、常量數(shù)據(jù)等。


我們知道STM32的中斷向量表里都是些常量數(shù)據(jù),所以包含中斷向量表的扇區(qū)不可進(jìn)行PCROP。一般來講向量表放在第一個(gè)扇區(qū),所以該扇區(qū)不可進(jìn)行PCROP。

 

不同的編譯工具鏈有其自己的配置方式去阻止編譯器生成文字池和分支表。我們來看一下基于MDK Keil中和IAR 開發(fā)環(huán)境的設(shè)置操作。


·Keil:使用Execute-only 命令

1) 右擊項(xiàng)目中的IP代碼文件組(比如ST 官方應(yīng)用筆記AN4701例子中的FIR-Filter),選擇“Options for Group‘FIR-Filter’”



在對(duì)話框中選擇“C/C++”頁面,選中“Execute-only code”,點(diǎn)“OK”。


2) 另外,還需修改Keil scatter file(.sct文件),設(shè)置IP 代碼為只可執(zhí)行代碼:



· IAR:No data reads incode memory

1) 右擊項(xiàng)目中的IP 代碼文件組(比如例子中的FIR-Filter),選擇“Options”

2) 另外,還需修改IAR ICF 文件(.icf 文件)。假如我們將IP 代碼放在Sector 2,那么,我們需要在.icf 中加入以下內(nèi)容,如下:




最后以一個(gè)基于STM32F4的PCROP實(shí)際應(yīng)用案例分享結(jié)尾。

某客戶使用了STM32F446ZET6,開啟PCROP 的功能,對(duì)他們的算法代碼進(jìn)行保護(hù)。在使用過程中,他發(fā)現(xiàn)位于PCROP 區(qū)的函數(shù)無法被用戶程序調(diào)用。

 

經(jīng)了解,客戶使用Keil  MDK 進(jìn)行項(xiàng)目的開發(fā)。檢查客戶的代碼,看是否在項(xiàng)目中的IP代碼的Options 中使能了“ExecuteonlyCode”選項(xiàng),發(fā)現(xiàn)并沒有將之使能。于是將此選項(xiàng)使能后,并編輯.sct 文件,再編譯,運(yùn)行代碼。問題解決。


原因就在于客戶未對(duì)IP 代碼部分進(jìn)行相應(yīng)的配置處理,從而導(dǎo)致編譯器未在PCROP區(qū)域避免生成文字池和分支表等數(shù)據(jù)。故而在調(diào)用PCROP內(nèi)部的函數(shù)時(shí)觸發(fā)了D-code 總線去訪問PCROP 區(qū)域,導(dǎo)致錯(cuò)誤發(fā)生。

 

對(duì)于PCROP 功能的詳細(xì)使用說明,請(qǐng)參考應(yīng)用筆記AN4701《Proprietary code read-out protection on microcontrollers of theSTM32F4 series》及其相應(yīng)的參考代碼X-CUBE-PCROP.zip。

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表