宮 健,裴煥斗,唐道光
(1.中北大學儀器與電子學院,山西太原 030051;2.山西百信信息技術有限公司,山西太原 030006)
可信計算是保障設備運算按照預期執(zhí)行的技術,而安全可信的計算環(huán)境由硬件平臺和操作系統(tǒng)共同組成[1],可信計算的核心思想是在執(zhí)行安全防護的同時進行運算[2]。我國進入可信計算3.0時代后,提出了主動防御思想,意在對系統(tǒng)實施主動監(jiān)控,確保應用程序按照預期結(jié)果執(zhí)行,使系統(tǒng)免于病毒、黑客威脅[3]。
可信計算的運算控制功能由處理器核實現(xiàn),對于處理器性能而言,絕對的硬件水平不是第一位的,指令集架構(gòu)同樣起到重要作用[4]。而在ARM和x86處于統(tǒng)治地位的同時,RISC-V 橫空出世,在世界各地及各種重要應用領域快速崛起。RISC-V 指令集易于移植,設計簡單方便,擁有完備的軟件開發(fā)工具鏈,方便進行嵌入式開發(fā),并且完全開源,無任何知識產(chǎn)權問題,任何公司或個人均可以根據(jù)其架構(gòu)進行處理器設計。這一特點很大程度上降低了處理器設計的準入門檻[5]。RISC-V 具有很好的穩(wěn)定性,因為其基準指令確定后不再發(fā)生改變[6]。
基于以上背景,文中在平衡性能、功耗的情況下,設計了一種適用于可信計算領域的32 位RISC-V 架構(gòu)處理器,通過了指令仿真測試,借助FPGA(Field-Programmable Gate Array)在國產(chǎn)操作系統(tǒng)深度下成功運行SM3 算法,并根據(jù)雜湊值計算比對結(jié)果,輸出對外部設備的主動控制信號。
文中采用無知識產(chǎn)權問題的開源指令集RISC-V設計適用可信計算的軟核處理器,其主要承擔設計的控制和運算功能,采用經(jīng)典5 級流水線設計可以顯著提高運算速度,提升數(shù)據(jù)吞吐率[7]。通過設備總線外接密碼模塊的方式,令處理器支持符合可信標準的國產(chǎn)密碼算法SM3,處理器通過SPI(Serial Peripheral Interface)接口對密碼模塊進行調(diào)用,計算雜湊值,并與預存雜湊值比對,根據(jù)比對結(jié)果正確的與否,可信主動控制邏輯將生成不同的I/O(Input/Output)控制信號,對外部可信設備發(fā)出控制命令[8]。圖1 為系統(tǒng)整體設計框圖。
圖1 整體設計框圖
1.1.1 流水線設計
指令執(zhí)行效率直接關系到CPU的運算性能,將一條指令的處理過程拆分為5 個階段,每個階段設計專門的硬件單元完成,在經(jīng)過一段時間的“建立時間”后,每個時鐘周期每個單元保持滿負荷運行,從而大大提高指令執(zhí)行效率[9]。流水線時空圖如圖2所示。
圖2 流水線時空圖
由圖2 可知,5 級流水線處理3 條指令花費7 個時間單位,相比串行執(zhí)行花費15 個時間單位,效率顯著提高。相比2 級或3 級流水線執(zhí)行階段時間過長的問題,采用5 級流水線硬件單元分布更均衡,吞吐率更高。處理器核總體設計如圖3 所示。
圖3 處理器核結(jié)構(gòu)
取指階段包含簡單譯碼模塊,譯出所取指令是否為跳轉(zhuǎn)指令,這樣可以簡化電路單元設計,由于沒有配備硬件分支預測器,同時考慮到功耗影響,因此采用靜態(tài)分支預測方法,設定向后跳轉(zhuǎn)預測為需要跳轉(zhuǎn),反之則不跳轉(zhuǎn)[10]。
譯碼階段依據(jù)RISC-V 指令結(jié)構(gòu)完成對指令的解析,包括確定當前指令源操作數(shù)地址、寫回地址等,根據(jù)地址信息從通用寄存器組中取出所需操作數(shù),并借助相關性檢查模塊確定指令是否存在數(shù)據(jù)相關。
執(zhí)行階段主要負責普通運算指令的計算,如加減法、移位運算。多周期乘除法由專門運算單元完成。一般來說,32 位數(shù)據(jù)的除法需要花費32 個時鐘周期來完成。為了加快運算效率,采用兩位試商法計算,只需16 個時鐘周期即可完成,大大提高多周期指令的執(zhí)行效率。這一階段對于訪存指令不作任何處理,直接送到訪存階段處理[11]。
訪存階段只進行訪存指令的地址計算及數(shù)據(jù)存取,對其余指令不作處理,直接送到下一階段即可。由于每個時鐘周期都需要取出一條指令,采用分離的指令存儲器和數(shù)據(jù)存儲器設計可以避免一個周期內(nèi)產(chǎn)生兩個訪問請求,產(chǎn)生存儲器結(jié)構(gòu)沖突。
寫回階段將指令計算結(jié)果按序送回通用寄存器,完成指令的最后處理。
1.1.2 數(shù)據(jù)相關處理
提高流水線級數(shù)在提升處理器性能的同時,也不可避免地引發(fā)了數(shù)據(jù)相關問題。由于該設計使用的是順序處理器,所以存在寫后讀相關,即假設指令x比指令y先進入指令隊列,而指令y需要指令x的計算結(jié)果,但指令x需要經(jīng)過寫回階段寫入通用寄存器,指令y才能讀到正確的數(shù)值,如此在鄰近指令中便產(chǎn)生了數(shù)據(jù)相關。
為此,該設計采用定向前推技術來解決流水線中的數(shù)據(jù)相關問題,即不等待數(shù)據(jù)被寫回通用寄存器,在相關數(shù)據(jù)產(chǎn)生時就將數(shù)據(jù)定向前推至所需單元[12]。譯碼-執(zhí)行相關解決方法如圖4 所示。
圖4 定向前推過程
指令x在執(zhí)行階段結(jié)束就計算出了寫回結(jié)果,按流水線進行,需等待寫回階段結(jié)束才能得到計算結(jié)果,可以在執(zhí)行階段結(jié)束將結(jié)果直接送入譯碼階段,這樣就避免了譯碼-執(zhí)行相關。同理,譯碼-訪存相關、譯碼-寫回相關也可以通過這樣的方式來解決。判斷是否存在譯碼-執(zhí)行相關的代碼如下:
對于加載指令,從數(shù)據(jù)存儲器中讀出結(jié)果才可以送回譯碼階段,所以當譯碼模塊檢測到當前是訪存指令后,流水線需要暫停一個時鐘周期,至訪存階段取出數(shù)據(jù),送回譯碼階段,否則會出現(xiàn)錯誤。
該設計外設部分通過SPI 接口外接密碼模塊,支持可信標準SM3 算法,具有可移植性強的優(yōu)點。密碼模塊完成SM3算法的執(zhí)行及計算結(jié)果的比對功能,最終通過可信主動控制邏輯實現(xiàn)對電源接口和IO接口的控制,完成對外部可信設備的控制與度量。UART(Universal Asynchronous Receiver/Transmitter)接口用來發(fā)送接收數(shù)據(jù),在深度系統(tǒng)終端上打印計算比對結(jié)果。GPIO(General-Purpose Input/Output)擴展接口作為處理器的JTAG(Joint Test Action Group)接口,完成對處理器的調(diào)試下載功能[13]。總線地址分配如圖5 所示。
圖5 總線地址分配
SM3 算法是我國自主設計的密碼算法,安全性高,全稱為SM3 密碼雜湊算法,其本質(zhì)上是一種哈希算法[14]。對于長度小于264bit的數(shù)據(jù),SM3 算法能將其轉(zhuǎn)化為256 bit的哈希值。其主要流程如下:
1)填充
首先在長度為X的數(shù)據(jù)后添加1 個“1”和Y個“0”,使其滿足1+X+Y=448mod512,其中Y取最小非負整數(shù)[15]。最后,將表示X長度的64 位2 進制比特串添加至數(shù)據(jù)末尾,構(gòu)成n組512 比特的數(shù)據(jù)格式。數(shù)據(jù)“ab”的填充結(jié)果如圖6 所示。
圖6 數(shù)據(jù)填充結(jié)果
2)迭代壓縮
將填充后的消息劃分為n組,每組長度為512 bit,例如消息“ab”只有1組,n取(X+Y+65)/512。
將填充后的消息進行迭代:
其中,CF是壓縮函數(shù),V(0)為256 bit 初始值IV:7380166f_4914b2b9_172442d7_da8a0600_a96f30bc_163138aa_e38dee4d_b0fb0e4e。
3)消息擴展
將消息分組B(i)(256 bit)進行擴展生成132 個字(132×32=4 224 bit)。
W0至W15:消息分組平均劃分為W0至W15,共16個字;
W16至W67:
其中,P1為置換函數(shù),⊕為異或運算,<<<為循環(huán)左移操作。置換函數(shù)算法步驟如下所示。
4)壓縮函數(shù)
A~H為8個32位寬數(shù)據(jù),F(xiàn)Fj、GGj為布爾函數(shù),其余為中間變量,計算步驟如下所示:
設計完成后,對處理器進行指令驗證。通過Vivado 2020.1 加載.coe 文件至指令存儲器完成初始化,并修改仿真環(huán)境調(diào)用第三方工具Modelsim 進行仿真,完成處理器整數(shù)指令驗證。當pc為0時,取指階段取出的指令碼為002081b3,可以得知此為ADD 指令,譯碼階段取出的兩個操作數(shù)分別為1和2,這條指令在訪存階段不作操作。經(jīng)過5 級流水后在寫回階段輸出結(jié)果為3,結(jié)果正確;經(jīng)過一個時鐘周期后,pc加4,取出下一條指令為SLT,比較操作數(shù)1和操作數(shù)2的大小,由于操作數(shù)1大于操作數(shù)2,輸出結(jié)果為0,結(jié)果正確。對不同類型的指令進行仿真驗證后,結(jié)果均與預期一致,處理器功能正常[16]。部分仿真波形如圖7所示。
圖7 仿真結(jié)果
該設計借助Vivado 2020.1 軟件將比特流文件燒寫至FPGA 開發(fā)板,型號選擇XI-LINX Artix-7 系列的XC7A100T-2FGG484。在國產(chǎn)操作系統(tǒng)深度下,安裝GNU 工具鏈,配置下載器及flash 鏈接腳本,將SM3 算法程序燒錄至外接flash 中,輸入明文計算出256 bit 雜湊值,與程序內(nèi)預存的雜湊值進行比對,最后通過可信主動控制邏輯實現(xiàn)對LED 燈的亮滅控制,并在終端上打印比對計算結(jié)果。終端打印結(jié)果如圖8 所示。
圖8 終端打印結(jié)果
該設計輸入abc 值模擬從外部可信設備中獲取的明文,通過計算比對,在結(jié)果正確的情況下控制FPGA 開發(fā)板的LED 燈,完成對IO 接口的控制。經(jīng)驗證,處理器控制功能正常。
文中提出一種用于可信計算的RISC-V 處理器方案,對內(nèi)核、外設以及算法原理進行了介紹。在國產(chǎn)操作系統(tǒng)深度下搭建交叉編譯環(huán)境,最終通過FPGA 實現(xiàn)軟件與硬件的交互。經(jīng)過驗證,處理器能流暢執(zhí)行SM3 密碼算法并完成雜湊值比對,輸出相關控制信號,達到預期目標,對可信計算領域有較高的應用價值。
未來將通過外接可信設備進行進一步驗證,并支持更多可信標準密碼算法,實現(xiàn)完備的可信計算體系。