錢 丹, 李 飛, 路而紅 ,王建新, 金華建
(1.成都信息工程學(xué)院 四川 成都 610225;2.北京電子科技學(xué)院 北京 100070;3.中國人民解放軍73022部隊(duì) 浙江 杭州 310024)
近年來,嵌入式技術(shù)已廣泛應(yīng)用于家電、無線通信、電子商務(wù)平臺(tái)中[1]?;谇度胧郊夹g(shù)開發(fā)的各類電子產(chǎn)品核心部件(CPU)的國產(chǎn)化,符合我國信息安全的戰(zhàn)略利益,是我國廣大科研人員努力的必然方向。值得一提的是,2001年蘇州國芯公司吸收和優(yōu)化了M*Core技術(shù),形成了具有我國自主知識(shí)產(chǎn)權(quán)的C*Core技術(shù),隨后,基于此技術(shù)的首款國產(chǎn)32位芯片CCM3118被推出[2]。然而,C*Core系統(tǒng)函數(shù)庫中自帶的動(dòng)態(tài)內(nèi)存分配函數(shù)在脫離Winsdows操作系統(tǒng)等情況下會(huì)失效,這給基于C*Core的內(nèi)存動(dòng)態(tài)開發(fā)帶來阻礙。筆者正是針對(duì)這一問題,提出一種基于C*Core的動(dòng)態(tài)內(nèi)存分配方案。
以CCM3118芯片為例,其片內(nèi)含2 kB ROM、64 kB SRAM,存儲(chǔ)器中整數(shù)型操作數(shù)格式是標(biāo)準(zhǔn)二進(jìn)制補(bǔ)碼形式[3],地址空間映射如圖1所示。
C*Core C指令系統(tǒng)中的操作數(shù)大小只可在兩處定義:1)在指令編碼中明確定義(裝載/存儲(chǔ)指令);2)在指令操作中間接定義。一般地,指令作用在32位源操作數(shù)和生成32位結(jié)果。在本方案實(shí)現(xiàn)部分,存儲(chǔ)器默認(rèn)采用大端(big-endian)方式存儲(chǔ)數(shù)據(jù) (如圖2所示),即字的最重要字節(jié)在地址低位。在寄存器中,一個(gè)字對(duì)應(yīng)的數(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
圖3 寄存器數(shù)據(jù)組織Fig.3 Register data organization
由圖1可知,C*Core系列芯片內(nèi)存資源有限,在計(jì)算量較大的情況下,例如在利用CCM3118芯片做橢圓曲線密碼算法(ECC)實(shí)現(xiàn)計(jì)算中,倘若采用全局?jǐn)?shù)組進(jìn)行ECC底層算法計(jì)算實(shí)現(xiàn)[5],芯片內(nèi)存不能提供足夠資源,但采用本方案可有效解決此問題。此外嵌入式系統(tǒng)對(duì)整個(gè)系統(tǒng)的安全和穩(wěn)定起著重要作用,故此程序的可靠與否關(guān)系著整個(gè)系統(tǒng)的安全運(yùn)行,此方案的實(shí)現(xiàn)利用標(biāo)準(zhǔn)C*Core C語言編寫,可確保程序?qū)崿F(xiàn)的可靠性與安全性。
程序定義一個(gè)結(jié)構(gòu)體實(shí)體Mem,如圖4所示,內(nèi)含兩類無符號(hào)字符型數(shù)據(jù)成員list[m]、meb[n],m、n大小自定。在編譯階段,Mem存儲(chǔ)空間被分配,相應(yīng)地其數(shù)據(jù)成員被分配內(nèi)存大小,共m+n個(gè)字節(jié)大小。
圖4 結(jié)構(gòu)體Mem示意圖Fig.4 Mem schematic structure
將list[0]~list[m-1]作為管理列表,用來管理數(shù)據(jù)塊meb[0]~meb[n-1]。list[]中的每一項(xiàng)都為8位數(shù)據(jù),其每一比特位1或0標(biāo)識(shí)一個(gè)meb[]項(xiàng)的分配與否,如圖5所示。
圖5 管理列表對(duì)應(yīng)數(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所示。動(dòng)態(tài)內(nèi)存分配時(shí),程序通過list[]找到適宜的數(shù)據(jù)塊meb[k],返回meb[k]首地址給用戶操作即可。已分配的meb[]對(duì)應(yīng)list[]設(shè)置為1,表示忙,避免二次分配。分配了的內(nèi)存不使用時(shí),及時(shí)回收,以免造成內(nèi)存浪費(fèi)。
圖6 管理內(nèi)存實(shí)例塊示意圖Fig.6 Example block diagram of memory management
2.2.1 管理列表和內(nèi)存塊分配
程序利用C*Core C語言實(shí)現(xiàn),編譯器不能識(shí)別除C*Core C自帶以外的其他關(guān)鍵字。程序封裝一結(jié)構(gòu)體,由方案原理可知,若管理列表list[]大小為10字節(jié),數(shù)據(jù)數(shù)組meb[]大小為80字節(jié)。當(dāng)定義一結(jié)構(gòu)體實(shí)體Mem后,其內(nèi)含的兩數(shù)據(jù)成員內(nèi)存大小共90字節(jié)的存儲(chǔ)空間在編譯階段便得以分配。偽代碼如下所示:
定義結(jié)構(gòu)體typedef struct
{
定義無符號(hào)字符型變量 list[10];//假定管理大小為10個(gè)字節(jié)
定義無符號(hào)字符型變量 meb[80];//假定數(shù)據(jù)塊大小為80個(gè)字節(jié)
}MEM;MEM Mem;//定義結(jié)構(gòu)體實(shí)體,至此90個(gè)字節(jié)的內(nèi)存被分配出來,其中80個(gè)位的管理機(jī)構(gòu)(list[0]~list[7])與80個(gè)字節(jié)的內(nèi)存塊(meb[0]~meb[79])
2.2.2 實(shí)現(xiàn)動(dòng)態(tài)內(nèi)存分配
程序核心部分源碼
INT8*Malloc(UINT8 Size)
{
UINT8 i,j,k;UINT8 Enter;
if(Size>MEM_COUNT||Size<1)
return' 博白县| 鲜城| 新沂市| 乌兰浩特市| 神木县| 白城市| 通州市| 德格县| 绥中县| 西昌市| 东乡族自治县| 张掖市| 罗江县| 故城县| 公安县| 台东县| 无锡市| 休宁县| 兴化市| 德州市| 宣汉县| 隆安县| 广德县| 唐山市| 育儿| 柳江县| 阿拉善左旗| 九台市| 六枝特区| 巨野县| 开化县| 三穗县| 太原市| 长海县| 上蔡县| 靖远县| 潞城市| 嘉善县| 涟水县| 温泉县| 上思县|