錢 丹, 李 飛, 路而紅 ,王建新, 金華建
(1.成都信息工程學院 四川 成都 610225;2.北京電子科技學院 北京 100070;3.中國人民解放軍73022部隊 浙江 杭州 310024)
近年來,嵌入式技術(shù)已廣泛應用于家電、無線通信、電子商務平臺中[1]?;谇度胧郊夹g(shù)開發(fā)的各類電子產(chǎn)品核心部件(CPU)的國產(chǎn)化,符合我國信息安全的戰(zhàn)略利益,是我國廣大科研人員努力的必然方向。值得一提的是,2001年蘇州國芯公司吸收和優(yōu)化了M*Core技術(shù),形成了具有我國自主知識產(chǎn)權(quán)的C*Core技術(shù),隨后,基于此技術(shù)的首款國產(chǎn)32位芯片CCM3118被推出[2]。然而,C*Core系統(tǒng)函數(shù)庫中自帶的動態(tài)內(nèi)存分配函數(shù)在脫離Winsdows操作系統(tǒng)等情況下會失效,這給基于C*Core的內(nèi)存動態(tài)開發(fā)帶來阻礙。筆者正是針對這一問題,提出一種基于C*Core的動態(tài)內(nèi)存分配方案。
1 C*Core數(shù)據(jù)格式分析
以CCM3118芯片為例,其片內(nèi)含2 kB ROM、64 kB SRAM,存儲器中整數(shù)型操作數(shù)格式是標準二進制補碼形式[3],地址空間映射如圖1所示。
C*Core C指令系統(tǒng)中的操作數(shù)大小只可在兩處定義:1)在指令編碼中明確定義(裝載/存儲指令);2)在指令操作中間接定義。一般地,指令作用在32位源操作數(shù)和生成32位結(jié)果。在本方案實現(xiàn)部分,存儲器默認采用大端(big-endian)方式存儲數(shù)據(jù) (如圖2所示),即字的最重要字節(jié)在地址低位。在寄存器中,一個字對應的數(shù)值是以第31位作為最重要位(如圖3所示),而0字節(jié)是最重要字節(jié)[4]。

圖1 內(nèi)存地址空間映射Fig.1 Memory address mapping

圖2 內(nèi)存數(shù)據(jù)組織Fig.2 Memory data organization
2 C*Core動態(tài)內(nèi)存分配方案及實現(xiàn)

圖3 寄存器數(shù)據(jù)組織Fig.3 Register data organization
由圖1可知,C*Core系列芯片內(nèi)存資源有限,在計算量較大的情況下,例如在利用CCM3118芯片做橢圓曲線密碼算法(ECC)實現(xiàn)計算中,倘若采用全局數(shù)組進行ECC底層算法計算實現(xiàn)[5],芯片內(nèi)存不能提供足夠資源,但采用本方案可有效解決此問題。此外嵌入式系統(tǒng)對整個系統(tǒng)的安全和穩(wěn)定起著重要作用,故此程序的可靠與否關(guān)系著整個系統(tǒng)的安全運行,此方案的實現(xiàn)利用標準C*Core C語言編寫,可確保程序?qū)崿F(xiàn)的可靠性與安全性。
2.1 方案基本原理
程序定義一個結(jié)構(gòu)體實體Mem,如圖4所示,內(nèi)含兩類無符號字符型數(shù)據(jù)成員list[m]、meb[n],m、n大小自定。在編譯階段,Mem存儲空間被分配,相應地其數(shù)據(jù)成員被分配內(nèi)存大小,共m+n個字節(jié)大小。

圖4 結(jié)構(gòu)體Mem示意圖Fig.4 Mem schematic structure
將list[0]~list[m-1]作為管理列表,用來管理數(shù)據(jù)塊meb[0]~meb[n-1]。list[]中的每一項都為8位數(shù)據(jù),其每一比特位1或0標識一個meb[]項的分配與否,如圖5所示。

圖5 管理列表對應數(shù)據(jù)塊示意圖Fig.5 The corresponding block diagram of a list about Management
例如,假定 list[]大小為 10,meb[]大小為 80,list[0]~list[9]管理meb[0]~meb[79]示意圖如圖6所示。動態(tài)內(nèi)存分配時,程序通過list[]找到適宜的數(shù)據(jù)塊meb[k],返回meb[k]首地址給用戶操作即可。已分配的meb[]對應list[]設(shè)置為1,表示忙,避免二次分配。分配了的內(nèi)存不使用時,及時回收,以免造成內(nèi)存浪費。

圖6 管理內(nèi)存實例塊示意圖Fig.6 Example block diagram of memory management
2.2 方案實現(xiàn)部分
2.2.1 管理列表和內(nèi)存塊分配
程序利用C*Core C語言實現(xiàn),編譯器不能識別除C*Core C自帶以外的其他關(guān)鍵字。程序封裝一結(jié)構(gòu)體,由方案原理可知,若管理列表list[]大小為10字節(jié),數(shù)據(jù)數(shù)組meb[]大小為80字節(jié)。當定義一結(jié)構(gòu)體實體Mem后,其內(nèi)含的兩數(shù)據(jù)成員內(nèi)存大小共90字節(jié)的存儲空間在編譯階段便得以分配。偽代碼如下所示:
定義結(jié)構(gòu)體typedef struct
{
定義無符號字符型變量 list[10];//假定管理大小為10個字節(jié)
定義無符號字符型變量 meb[80];//假定數(shù)據(jù)塊大小為80個字節(jié)
}MEM;MEM Mem;//定義結(jié)構(gòu)體實體,至此90個字節(jié)的內(nèi)存被分配出來,其中80個位的管理機構(gòu)(list[0]~list[7])與80個字節(jié)的內(nèi)存塊(meb[0]~meb[79])
2.2.2 實現(xiàn)動態(tài)內(nèi)存分配
程序核心部分源碼
INT8*Malloc(UINT8 Size)
{
UINT8 i,j,k;UINT8 Enter;
if(Size>MEM_COUNT||Size<1)
return'