一種基于線形匯編指令差異性變換的dsp軟錯(cuò)誤檢測(cè)方法
【專利摘要】本發(fā)明公開(kāi)了一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,目的是解決現(xiàn)有DSP軟錯(cuò)誤檢測(cè)方法性能開(kāi)銷大的問(wèn)題。技術(shù)方案是將程序劃分為無(wú)存基本塊,構(gòu)建程序控制流圖,識(shí)別出循環(huán),篩選出可編排軟件流水的循環(huán);對(duì)程序進(jìn)行加固,為程序添加錯(cuò)誤檢測(cè)指令,采用指令差異性變換方法對(duì)部分指令進(jìn)行等價(jià)性變換,對(duì)其余指令進(jìn)行復(fù)算,并在存儲(chǔ)指令及跳轉(zhuǎn)指令前插入檢測(cè)指令,利用DSP指令條件執(zhí)行的特點(diǎn)及等價(jià)變換方法優(yōu)化檢測(cè)指令,針對(duì)可編排軟件流水的循環(huán)采用延遲錯(cuò)誤處理方法降低加固帶來(lái)的性能開(kāi)銷;執(zhí)行加固后的程序,檢測(cè)發(fā)生在運(yùn)行時(shí)的軟錯(cuò)誤。本發(fā)明是一種純軟件的DSP加固方法,對(duì)數(shù)據(jù)錯(cuò)誤的檢測(cè)率高,且加固的性能開(kāi)銷低。
【專利說(shuō)明】
-種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法
技術(shù)領(lǐng)域
[0001 ] 本發(fā)明設(shè)及一種針對(duì)數(shù)字信號(hào)處理器DSP(Digital Si即al Processor)程序的錯(cuò) 誤檢測(cè)方法,尤其是針對(duì)空間高能粒子福射引發(fā)的軟錯(cuò)誤進(jìn)行檢測(cè)的方法。
【背景技術(shù)】
[0002] 近年來(lái),隨著集成電路工藝技術(shù)的發(fā)展,處理器設(shè)計(jì)人員采用越來(lái)越高的時(shí)鐘頻 率、越來(lái)越低的電壓水平W及越來(lái)越小的工藝尺寸。運(yùn)些技術(shù)在帶來(lái)更高性能與更低功耗 的同時(shí),也使得處理器對(duì)瞬態(tài)故障更加敏感,威脅到程序執(zhí)行的正確性。運(yùn)些瞬態(tài)故障通常 是由外部環(huán)境中高能粒子福射和電壓擾動(dòng)、電磁干擾等誘發(fā)。與永久性故障導(dǎo)致的硬件錯(cuò) 誤相比,運(yùn)種錯(cuò)誤具有瞬態(tài)、發(fā)生時(shí)間和位置隨機(jī)、可恢復(fù)等特點(diǎn),因此被稱為"軟錯(cuò)誤"。工 程人員提出了很多技術(shù)來(lái)處理軟錯(cuò)誤的問(wèn)題,運(yùn)些技術(shù)主要可分為兩類:硬件技術(shù)和軟件 技術(shù)。
[0003] 硬件技術(shù)主要采用體系結(jié)構(gòu)冗余的思想實(shí)現(xiàn)容錯(cuò)。例如,一些存儲(chǔ)結(jié)構(gòu)比如緩存 和內(nèi)存包含ECC化rror Correcting Code),可W用來(lái)檢測(cè)甚至改正錯(cuò)誤,此外較為常用的 錯(cuò)誤校驗(yàn)碼技術(shù)還包括抓AC,它們是通過(guò)設(shè)置冗余的二進(jìn)制位來(lái)實(shí)現(xiàn)的。也可W通過(guò)設(shè)置 ??诘挠布z測(cè)電路實(shí)現(xiàn)容錯(cuò),如采用專用處理器來(lái)檢測(cè)總線上數(shù)據(jù)正確性的看口狗技術(shù) WatchDog。在一些可靠性要求較高的系統(tǒng)中,TMR(Triple-Modular Redundancy)應(yīng)用比較 廣泛,它通過(guò)=個(gè)同時(shí)工作的部件W投票的形式實(shí)現(xiàn)錯(cuò)誤的檢測(cè)和恢復(fù),是部件級(jí)別的冗 余。硬件容錯(cuò)技術(shù)思想簡(jiǎn)單,可W顯著的提高系統(tǒng)的可靠性,但同時(shí)會(huì)在體積、功耗等方面 引入巨大的硬件開(kāi)銷,運(yùn)在很多嵌入式系統(tǒng)的設(shè)計(jì)中是無(wú)法接受的。
[0004] 為了緩解硬件容錯(cuò)技術(shù)硬件開(kāi)銷大的問(wèn)題,同時(shí)也是對(duì)硬件容錯(cuò)技術(shù)更好的完善 和拓展,軟件容錯(cuò)技術(shù)成為了研究熱點(diǎn)。軟件容錯(cuò)技術(shù),也稱為軟加固技術(shù)。計(jì)算機(jī)發(fā)展的 歷史表明,很多原本用硬件實(shí)現(xiàn)的方法同樣可W用軟件實(shí)現(xiàn)。隨著處理器性能的極大提升, 在滿足時(shí)間約束的前提下,通過(guò)程序復(fù)算犧牲部分性能來(lái)?yè)Q取高可靠性的軟件容錯(cuò)技術(shù)展 現(xiàn)出了很強(qiáng)的吸引力。
[0005] 軟件容錯(cuò)技術(shù)包括錯(cuò)誤檢測(cè)、定位、回復(fù)等技術(shù),其中錯(cuò)誤檢測(cè)是錯(cuò)誤定位和恢復(fù) 的基礎(chǔ)??臻g福射環(huán)境中的單粒子效應(yīng)可能改變寄存器、存儲(chǔ)器、Cache中存儲(chǔ)的數(shù)據(jù)、運(yùn)算 單元執(zhí)行結(jié)果,導(dǎo)致執(zhí)行結(jié)果出錯(cuò),運(yùn)一類軟錯(cuò)誤屬于數(shù)據(jù)錯(cuò)誤。數(shù)據(jù)錯(cuò)誤主要通過(guò)指令復(fù) 算的方式實(shí)現(xiàn)錯(cuò)誤檢測(cè),其檢測(cè)原理如下:由于軟錯(cuò)誤具有瞬時(shí)性、偶發(fā)性和隨機(jī)性等特 點(diǎn),指令同一時(shí)間在不同功能部件上多次執(zhí)行,或者不同時(shí)間在相同功能部件上多次執(zhí)行 的過(guò)程中,發(fā)生相同錯(cuò)誤的概率非常低,因此將運(yùn)多次執(zhí)行的結(jié)果進(jìn)行比較,若相符則認(rèn)為 指令執(zhí)行結(jié)果正確,否則說(shuō)明至少在一次執(zhí)行過(guò)程中發(fā)生了軟錯(cuò)誤。通過(guò)指令復(fù)算,一般可 W檢測(cè)出瞬時(shí)故障導(dǎo)致的軟錯(cuò)誤。
[0006] 2002年《I趾E Transactions on Reliability》第51卷第1期發(fā)表的作者為 Stanf ord大學(xué)CRC實(shí)驗(yàn)室的N. Oh、P. P. Shirvani、E. J. McCluskey 的論文巧rror detect ion by duplicated instructions in super-scalar processors"提出的EDDI方法是常用的 數(shù)據(jù)流檢錯(cuò)方法。抓DI通過(guò)復(fù)制程序指令來(lái)實(shí)現(xiàn)冗余,進(jìn)而通過(guò)插入點(diǎn)比較來(lái)實(shí)現(xiàn)容錯(cuò)。故 障注入實(shí)驗(yàn)表明:使用抓DI后,程序的平均出錯(cuò)概率從20%下降到1.5% W下。抓DI方法的 基本步驟是:
[0007] 第一步,將程序劃分為N個(gè)無(wú)存基本塊SBBi,SBB2,…SBBn的序列,N為正整數(shù),無(wú)存 基本塊是程序中能夠順序執(zhí)行的指令序列的集合,運(yùn)組指令序列只有最后一條指令可W是 存儲(chǔ)指令或程序控制指令,運(yùn)組指令只有一個(gè)入口和一個(gè)出口,入口就是第一條指令,出口 就是最后一條指令。劃分無(wú)存基本塊序列的具體步驟是:
[000引1.1確定程序的每個(gè)無(wú)存基本塊的入口指令,它們是:
[0009] ?程序的第一條指令;或者
[0010] ?存儲(chǔ)指令、條件轉(zhuǎn)移指令或無(wú)條件轉(zhuǎn)移指令跳轉(zhuǎn)到的指令;或者
[0011] ?緊跟在存儲(chǔ)指令、轉(zhuǎn)移指令或函數(shù)調(diào)用后面的指令;或者
[0012] ?被調(diào)用函數(shù)的第一條指令。
[001引1.2對(duì)每個(gè)入口指令,確定其對(duì)應(yīng)的出口指令,它鳩:
[0014] ?入口指令后除當(dāng)前入口指令外的第一個(gè)入口指令前的指令;或者
[0015] ?入口指令后的第一個(gè)存儲(chǔ)指令、轉(zhuǎn)移指令或函數(shù)調(diào)用指令;或者
[0016] ?程序的結(jié)束指令。
[0017] 1.3分別將每個(gè)入口指令和其對(duì)應(yīng)的出口指令之間的程序塊劃分為一個(gè)無(wú)存基本 塊。
[0018] 第二步,對(duì)程序進(jìn)行加固,即為每個(gè)無(wú)存基本塊添加合適的復(fù)算指令或檢測(cè)指令, 復(fù)算指令與原指令具有相同的指令碼,復(fù)算指令中的操作數(shù)為原指令中操作數(shù)的副本,具 體做法為:
[0019] 2.1 令 il = l。
[0020] 2.2在SBBii除最后一條指令外的每一條指令后面插入對(duì)應(yīng)的復(fù)算指令。
[0021 ] 2.3若SBBii最后一條指令不為跳轉(zhuǎn)指令或存儲(chǔ)指令,則在運(yùn)條指令后面插入對(duì)應(yīng) 的復(fù)算指令,轉(zhuǎn)2.6。
[0022] 2.4若SBBii最后一條指令為存儲(chǔ)指令,則在運(yùn)條指令前插入第一檢測(cè)指令(第一檢 測(cè)指令的功能是檢測(cè)存儲(chǔ)指令的數(shù)據(jù)、內(nèi)存地址、偏移量、指令執(zhí)行條件等變量原始數(shù)據(jù)與 副本數(shù)據(jù)是否一致,不一致則表示檢測(cè)到錯(cuò)誤),轉(zhuǎn)2.6。
[0023] 2.5若SBBii最后一條指令為跳轉(zhuǎn)指令,則在運(yùn)條指令前插入第二檢測(cè)指令(第二檢 測(cè)指令的功能是檢測(cè)跳轉(zhuǎn)指令的指令執(zhí)行條件、內(nèi)存地址等變量原始數(shù)據(jù)與副本數(shù)據(jù)是否 一致,不一致則表示檢測(cè)到錯(cuò)誤),轉(zhuǎn)2.6。
[0024] 2.6il = il+l。
[0025] 2.7判斷il是否大于N,若是則執(zhí)行第S步,否則轉(zhuǎn)第2.2步。
[0026] 第=步,執(zhí)行加固后的程序,檢測(cè)發(fā)生在運(yùn)行時(shí)的軟錯(cuò)誤,具體步驟為:
[0027] 3.1若加固后的程序執(zhí)行過(guò)程中沒(méi)有發(fā)生單粒子翻轉(zhuǎn)等原因?qū)е碌能涘e(cuò)誤,則原 指令和副本指令具有相同的執(zhí)行結(jié)果,加固后的程序不會(huì)檢測(cè)到錯(cuò)誤,加固后的程序正常 執(zhí)行與加固前的執(zhí)行結(jié)果相同,轉(zhuǎn)第四步。
[0028] 3.2若加固后的程序執(zhí)行過(guò)程中發(fā)生單粒子翻轉(zhuǎn)等原因?qū)е碌能涘e(cuò)誤,使得原指 令與副本指令執(zhí)行結(jié)果不同,貝陽(yáng)日固后的程序檢測(cè)到此軟錯(cuò)誤,轉(zhuǎn)第四步。
[0029] 第四步,結(jié)束。
[0030] CRC實(shí)驗(yàn)室在抓DI基礎(chǔ)上引入數(shù)據(jù)差異性概念(Data Diversity),于2002年在 《IEEE Transactions on Computer》第51 卷第2其月發(fā)表論文(屯〇4;[:Error Detection by Diverse Data and Duplicated Instructions"提出邸4I方法。邸4I與邸DI方法在步驟上基 本相同,但其中的SI不再是MI的單純復(fù)制,而是將MI中的輸入數(shù)據(jù)乘W-個(gè)差異因子k作為 SI中的輸入數(shù)據(jù),若輸出數(shù)據(jù)依然保持k倍的關(guān)系,則認(rèn)為指令執(zhí)行過(guò)程中沒(méi)有發(fā)生錯(cuò)誤。 由于數(shù)據(jù)差異因子的引入,使得抓4I可W檢測(cè)一部分持續(xù)性故障和永久性故障。數(shù)據(jù)差異 因子的選擇對(duì)邸4I方法的故障檢測(cè)能力影響很大,最優(yōu)k值也難W求出。另外,數(shù)據(jù)都乘Wk 倍可能會(huì)導(dǎo)致數(shù)據(jù)溢出的問(wèn)題。原文章建議將k值選為-1,即將所有數(shù)據(jù)求反,但論證結(jié)果 表明很多時(shí)候-1并不是最佳差異因子。雖然抓4I方法在抓DI方法的基礎(chǔ)上進(jìn)一步提高了錯(cuò) 誤檢測(cè)率,但也引入了更多的性能開(kāi)銷。
[0031] 2008年國(guó)防科技大學(xué)李建立的碩±學(xué)位論文《空間福射環(huán)境下軟件實(shí)現(xiàn)的硬件故 障檢測(cè)技術(shù)研究》中第S章提出了基于逆向恢復(fù)的故障檢測(cè)方法抓CC化rror Detection by Converse Computing),思想也是對(duì)SI做差異性變換,W提高軟錯(cuò)誤檢測(cè)率和檢測(cè)永久 性故障錯(cuò)誤的能力。EDCC方法的主要原理是計(jì)算的可逆性,通過(guò)對(duì)程序進(jìn)行逆向恢復(fù)運(yùn)算, 使得SI變成與MI完全不同的指令,增加了指令之間的差異性,達(dá)到最大限度暴露故障的目 的,提高了故障檢測(cè)率,同時(shí)克服了ED4I數(shù)據(jù)溢出的問(wèn)題。但逆向恢復(fù)運(yùn)算都是針對(duì)運(yùn)算指 令進(jìn)行的,對(duì)于運(yùn)算操作比例不高的程序,EDCC會(huì)插入很多比較指令卻只能檢測(cè)相對(duì)較少 的運(yùn)算錯(cuò)誤,故障檢測(cè)能力因此會(huì)有所下降。
[0032] 高性能數(shù)字信號(hào)處理器DSP由于其處理復(fù)雜信號(hào)能力強(qiáng)、靈活性高等優(yōu)點(diǎn),已經(jīng)越 來(lái)越多地應(yīng)用到星載信號(hào)處理系統(tǒng)中。然而,高性能DSP空間應(yīng)用受到了可靠性的制約???間探測(cè)活動(dòng)投入大、風(fēng)險(xiǎn)高,對(duì)可靠性有著極高的要求。太空中影響空間探測(cè)器安全的主要 因素是宇宙射線的福射,因?yàn)檫\(yùn)些宇宙射線中的高能帶電粒子流會(huì)使電子器件出現(xiàn)硬件故 障,因此航天應(yīng)用等特殊領(lǐng)域需要針對(duì)DSP程序進(jìn)行容錯(cuò)加固。
[0033] 從并行處理的角度分析,新型的TMS320C6000系列DSP的主要特點(diǎn)是采用了超長(zhǎng)指 令字化IW(Very Long Instruction Words)的體系結(jié)構(gòu)。在C6000片內(nèi)共有8個(gè)并發(fā)工作的 功能單元,單指令字長(zhǎng)為32M t,8條指令組成一個(gè)指令包,一個(gè)指令包字長(zhǎng)為256M t。忍片 內(nèi)部設(shè)置了??诘闹噶罘峙淠K,可W將25化it的指令包同時(shí)分配給8個(gè)功能單元,一個(gè)周 期最多可W同時(shí)執(zhí)行8條指令。VLIW結(jié)構(gòu)中,指令并行性和數(shù)據(jù)傳送完全是在編譯時(shí)確定 的,運(yùn)與運(yùn)行時(shí)的資源調(diào)度和同步不同,運(yùn)種結(jié)構(gòu)中每條指令的等效周期數(shù)很低,即運(yùn)行速 度很快。VLIW結(jié)構(gòu)中指令獲取、指令分配、指令執(zhí)行、數(shù)據(jù)存儲(chǔ)等階段需要進(jìn)行多級(jí)流水,不 同指令執(zhí)行的流水延遲時(shí)間也不相等。運(yùn)種深流水線給編程和編譯帶來(lái)困難,指令安排稍 有不當(dāng)將破壞流水線,使得性能下降。因此化IW結(jié)構(gòu)執(zhí)行代碼效率很大程度上取決于程序 中循環(huán)的軟件流水排布。
[0034] 為了提高程序的性能,可W將程序用線形匯編實(shí)現(xiàn)。線形匯編是一種TUTexas Instrument)公司提供的CCS(Code Composer Sl:udio)環(huán)境支持的可用于DSP平臺(tái)的編程語(yǔ) 言。線形匯編使用匯編指令集,但因其不用指定所使用的功能單元、物理寄存器W及指令并 行,所W更加利于編程實(shí)現(xiàn)。線形匯編代碼經(jīng)過(guò)匯編器編譯可生成最終執(zhí)行的高度并行的 匯編代碼。在編譯過(guò)程中,匯編器為線形匯編指令分配物理寄存器、指定運(yùn)行的功能單元, 為循環(huán)編排軟件流水線。線形匯編代碼經(jīng)過(guò)匯編器編譯后可W生成高度并行的匯編代碼。
[0035] 傳統(tǒng)的指令級(jí)錯(cuò)誤檢測(cè)方法針對(duì)編譯后的目標(biāo)代碼進(jìn)行加固。編譯后的DSP匯編 代碼并行度很高,若插入加固指令很有可能破壞DSP軟件流水線,致使性能顯著降低。且編 譯后的程序幾乎占用了所有的物理寄存器和功能單元,在此基礎(chǔ)上很難插入加固指令。因 此,使用傳統(tǒng)的針對(duì)目標(biāo)代碼的指令級(jí)錯(cuò)誤檢測(cè)方法很難對(duì)DSP程序進(jìn)行軟加固。
[0036] 如何解決DSP軟加固問(wèn)題是本領(lǐng)域技術(shù)人員極為關(guān)注的熱點(diǎn)問(wèn)題。但總的來(lái)說(shuō), DSP程序的軟錯(cuò)誤檢測(cè)方法還存在W下幾個(gè)方面的問(wèn)題:
[0037] (1)加固后的程序可能破壞DSP的軟件流水線,使得程序運(yùn)行時(shí)間開(kāi)銷顯著提高。
[0038] (2)復(fù)算指令和原指令具有相同的指令碼,使用相同的功能單元,容易形成流水線 堵塞,降低程序運(yùn)行速度。
[0039] (3)無(wú)法檢測(cè)出發(fā)生在指令譯碼單元和功能單元中的軟錯(cuò)誤,因?yàn)閺?fù)算指令和原 指令具有相同的指令碼,使用相同的功能單元,若錯(cuò)誤會(huì)導(dǎo)致原數(shù)據(jù)和副本數(shù)據(jù)發(fā)生相同 的錯(cuò)誤結(jié)果。
[0040] 因?yàn)橐延熊浖?shí)現(xiàn)的軟錯(cuò)錯(cuò)誤檢測(cè)方法在DSP中存在上述問(wèn)題,必須研究檢測(cè)效 率更高而對(duì)程序本身性能影響較小的軟錯(cuò)誤檢測(cè)方法。
【發(fā)明內(nèi)容】
[0041] 本發(fā)明要解決的技術(shù)問(wèn)題是,克服已有的軟錯(cuò)誤檢測(cè)方法不適用于DSPW及基于 源代碼級(jí)方法執(zhí)行性能開(kāi)銷大的問(wèn)題,提供一種基于線形匯編指令差異性變換的DSP軟錯(cuò) 誤檢測(cè)方法,將線形匯編源程序轉(zhuǎn)換為具有軟錯(cuò)誤檢測(cè)能力的線形匯編程序,通過(guò)=大指 令差異性變換方法:指令等價(jià)變換、優(yōu)化檢測(cè)指令、延遲錯(cuò)誤處理,顯著提高加固后代碼的 執(zhí)行效率,同時(shí)增加指令之間的差異性,達(dá)到最大限度暴露故障的目的,提高軟錯(cuò)誤檢測(cè) 率。指令等價(jià)變換方法是對(duì)DSP線形匯編指令進(jìn)行語(yǔ)義等價(jià)變化,用執(zhí)行時(shí)間短的指令替換 執(zhí)行時(shí)間長(zhǎng)的指令,用可分配功能單元多的指令替換可分配功能單元少的指令,顯著降低 加固的性能開(kāi)銷,同時(shí)增加指令碼的差異性。優(yōu)化檢測(cè)指令方法是在檢測(cè)指令中用異或指 令XOR取代比較指令CMPEQ來(lái)進(jìn)行檢測(cè)(因 XO財(cái)目較于CMPEQ更利于功能單元的分配和軟件流 水線的編排),同時(shí)利用DSP指令條件執(zhí)行的特點(diǎn),將同一組檢測(cè)指令中的若干跳轉(zhuǎn)指令合 并為一條跳轉(zhuǎn)指令,從而顯著降低加固的性能開(kāi)銷。延遲錯(cuò)誤處理方法是針對(duì)可被編譯優(yōu) 化的循環(huán),使用一個(gè)寄存器邸ROR記錄循環(huán)內(nèi)部檢測(cè)到的錯(cuò)誤,并將運(yùn)些錯(cuò)誤延遲到循環(huán)結(jié) 束再處理,從而顯著降低加固的性能開(kāi)銷。
[0042] 本發(fā)明的技術(shù)方案是:針對(duì)原始線形匯編程序,將程序劃分為無(wú)存基本塊序列;W 無(wú)存基本塊序列構(gòu)建程序控制流圖;基于程序控制流圖,識(shí)別出循環(huán),并篩選出可編排軟件 流水的循環(huán),為運(yùn)種循環(huán)的基本塊做標(biāo)識(shí);對(duì)程序進(jìn)行加固,為每個(gè)無(wú)存基本塊添加錯(cuò)誤檢 測(cè)指令,采用指令差異性變換方法,對(duì)部分指令進(jìn)行等價(jià)性變換,用執(zhí)行時(shí)間短的指令替換 執(zhí)行時(shí)間長(zhǎng)的指令,用可分配功能單元多的指令替換可分配功能單元少的指令,對(duì)其余指 令進(jìn)行復(fù)算,并在存儲(chǔ)指令W及跳轉(zhuǎn)指令前插入檢測(cè)指令,利用DSP指令條件執(zhí)行的特點(diǎn)W 及等價(jià)變換方法優(yōu)化檢測(cè)指令,并針對(duì)標(biāo)識(shí)循環(huán)的基本塊采用延遲錯(cuò)誤處理方法,降低加 固帶來(lái)的性能開(kāi)銷;執(zhí)行加固后的程序,檢測(cè)發(fā)生在運(yùn)行時(shí)的軟錯(cuò)誤。
[0043] 具體技術(shù)方案為:
[0044] 第一步,將程序劃分為N個(gè)無(wú)存基本塊SBBi,SBB2,…SBBn的序列,具體方法與背景 技術(shù)所述邸DI方法第一步相同。
[0045] 第二步,基于無(wú)存基本塊序列SBBi,SBB2,…SBBn,構(gòu)造程序控制流圖G(V,E),V為節(jié) 點(diǎn)集合,取值為Vi,V2,一Vm, V功程序的入口節(jié)點(diǎn),Vm為程序的出口節(jié)點(diǎn),E為邊集合。具體過(guò) 程為:
[0046] 2.1將每個(gè)無(wú)存基本塊作為G (V,E)的一個(gè)節(jié)點(diǎn)。
[0047] 2.2令i2 = 1。2.3判斷SBBu最后一條指令的類型,若為無(wú)條件跳轉(zhuǎn)指令則執(zhí)行第 2.4步,若為條件跳轉(zhuǎn)指令則執(zhí)行第2.5步,若為函數(shù)調(diào)用指令則執(zhí)行第2.7步,否則為普通 指令,執(zhí)行第2.6步。
[004引2.4在G (V,E)中添加一條節(jié)點(diǎn)SBBi2到轉(zhuǎn)移目標(biāo)所在的基本塊節(jié)點(diǎn)的有向邊,轉(zhuǎn)2.8 步。
[0049] 2.5在6(¥,6)中添加一條節(jié)點(diǎn)58812到轉(zhuǎn)移目標(biāo)所在的基本塊節(jié)點(diǎn)的有向邊,并且 添加一條節(jié)點(diǎn)58812到節(jié)點(diǎn)58812+1的有向邊,轉(zhuǎn)2.8步。
[0050] 2.6在6八6)中添加一條節(jié)點(diǎn)58812到節(jié)點(diǎn)58812+1的有向邊,轉(zhuǎn)第2.8步。
[0051 ] 2.7在G(V,E)中從SBBi2向被調(diào)用函數(shù)的入口無(wú)存基本塊畫一條有向邊,并且從被 調(diào)用函數(shù)的退出無(wú)存基本塊向SBBi2+i畫一條有向邊,表示函數(shù)返回的控制流轉(zhuǎn)移,轉(zhuǎn)2.8 步。
[0化2] 2.8i2 = i2+l。
[0053] 2.9判斷i2是否大于N,若是則得到G(V,E),執(zhí)行第S步,否則執(zhí)行第2.3步。
[0054] 第=步,基于G(V,E),找到程序中所有可被編譯優(yōu)化的循環(huán),并為運(yùn)些循環(huán)的無(wú)存 基本塊做標(biāo)識(shí)。可被編譯優(yōu)化的循環(huán)即除了循環(huán)的第一個(gè)無(wú)存基本塊外沒(méi)有循環(huán)外部到其 內(nèi)部的控制流轉(zhuǎn)移,且除了循環(huán)的最后一個(gè)無(wú)存基本塊外沒(méi)有循環(huán)內(nèi)部到外部的控制流轉(zhuǎn) 移,體現(xiàn)在控制流圖上即循環(huán)除頭節(jié)點(diǎn)具有多個(gè)入度外,其余節(jié)點(diǎn)入度為1,除尾節(jié)點(diǎn)具有 多出度外,其余節(jié)點(diǎn)出度為1。運(yùn)一步的具體過(guò)程為:
[0055] 3.1從Vi開(kāi)始采用深度優(yōu)先捜索遍歷G(V,E),得到一個(gè)樹(shù)形結(jié)構(gòu)T,T的葉節(jié)點(diǎn)是程 序執(zhí)行結(jié)束的節(jié)點(diǎn)或者是G(V,E)的深度優(yōu)先捜索已經(jīng)遍歷過(guò)的節(jié)點(diǎn)。具體步驟為:
[0化6] 3.1.1建立樹(shù)結(jié)構(gòu)T,令根節(jié)點(diǎn)為Vo。
[0057] 3.1.2令¥13 = ¥1,¥14 = ¥〇。
[0化引 3.1.3將Vi3加入樹(shù)形結(jié)構(gòu)T,作為T中Vi4的子節(jié)點(diǎn)。
[0059] 3.1.4判斷Vi3是否遍歷過(guò),若是則執(zhí)行第3.1.5步,否則執(zhí)行第3.1.6步。
[0060] 3.1.5令Vi3=Vi4, Vi4=Vi4 在T 中的父節(jié)點(diǎn)。
[0061] 3.1.6判斷是否有從Vi3出發(fā)未被訪問(wèn)的路徑,若有則執(zhí)行第3.1.7步,否則執(zhí)行第 3.1.8 步。
[00創(chuàng) 3.1.7令Vi4 = Vi3,Vi3 = Vi3通過(guò)運(yùn)條路徑連接的節(jié)點(diǎn),執(zhí)行第3.1.3步。
[00創(chuàng) 3.1.8判斷Vi3是否等于Vi,若是則表示得到了 T,轉(zhuǎn)3.2步,否則執(zhí)行第3.1.9步。
[0064] 3.1.9令¥13 = ¥14,心=¥14在1'中的父節(jié)點(diǎn),執(zhí)行第3.1.6步。
[0065] 3.2遍歷樹(shù)形結(jié)構(gòu)T,得到T中所有葉節(jié)點(diǎn)^山,…,Lni, Nl為T中葉節(jié)點(diǎn)的個(gè)數(shù)。
[0066] 3.3從每個(gè)葉節(jié)點(diǎn)開(kāi)始,向上捜索,若一個(gè)葉節(jié)點(diǎn)和它的某個(gè)祖先結(jié)點(diǎn)相同,則找 到該祖先節(jié)點(diǎn)到此葉節(jié)點(diǎn)的循環(huán),將找到的循環(huán)存放在集合LOOP中。運(yùn)一步的具體步驟為:
[0067] 3.3.1令巧=I,集合LQOP= 0。
[006引 3.3.2令Lf =以5的父節(jié)點(diǎn)。
[00例 3.3.3判斷Lf是否等于LiS,若不等于則轉(zhuǎn)3.3.4,若等于則找到一條從Lf到LiS的循 環(huán),加入到集合LOOP中。
[0070] 3.3.4判斷Lf是否等于樹(shù)T的根節(jié)點(diǎn)Vq,若是則巧二巧+1,轉(zhuǎn)3.3.5步,否則令Lf = Lf 在T中的父節(jié)點(diǎn),執(zhí)行第3.3.3步。
[0071] 3.3.5判斷巧是否大于NI,若是則表示捜索完畢,得到了 LOOP,執(zhí)行3.4步,否則執(zhí) 行第3.3.2步。
[0072] 3.4從集合LOOP中篩選出可被編譯優(yōu)化的循環(huán),并為運(yùn)些循環(huán)的無(wú)存基本塊做標(biāo) 識(shí)??杀痪幾g優(yōu)化的循環(huán)是指在G(V,E)中除頭節(jié)點(diǎn)具有多個(gè)入度外,其余節(jié)點(diǎn)入度為1,除 尾節(jié)點(diǎn)具有多出度外,其余節(jié)點(diǎn)出度為1的循環(huán)。具體步驟為:
[0073] 3.4.1判斷LOOP是否為空集,若是則執(zhí)行第四步,否則執(zhí)行第3.4.2步。
[0074] 3.4.2選取LOOP 中的一個(gè)循環(huán) 1 i,LOOP = LOOP- {1 i}。
[0075] 3.4.3判斷Ii是否可被編譯優(yōu)化,若不可則轉(zhuǎn)第3.4.1步,若可被編譯優(yōu)化,執(zhí)行 3.4.4 步。
[0076] 3.4.4為每個(gè)屬于1 i的無(wú)存基本塊做標(biāo)識(shí)L,且為1 i的第一個(gè)和最后一個(gè)無(wú)存基本 塊分別做標(biāo)識(shí)H和T,轉(zhuǎn)3.4.1步。
[0077] 第四步,對(duì)程序進(jìn)行加固,即為無(wú)存基本塊序列SBBi,SBB2,一SBBn添加合適的復(fù)算 指令和檢測(cè)指令,添加的檢測(cè)指令都采用優(yōu)化檢測(cè)指令方法進(jìn)行優(yōu)化W減少引入的跳轉(zhuǎn)指 令,降低加固帶來(lái)的性能開(kāi)銷。對(duì)于可被編譯優(yōu)化的循環(huán)采用延遲錯(cuò)誤處理方法降低加固 帶來(lái)的性能開(kāi)銷。第四步的具體過(guò)程為:
[007引 4.1 令 16 = 1。
[0079] 4.2對(duì)SBBiS除最后一條指令外的所有源程序指令MI,生成相應(yīng)的副本指令SI插入 到對(duì)應(yīng)的MI指令后面,采用指令等價(jià)變換方法對(duì)W下所述指令進(jìn)行指令差異性復(fù)算,提高 錯(cuò)誤檢測(cè)能力,用執(zhí)行時(shí)間短的指令替換執(zhí)行時(shí)間長(zhǎng)者,用可分配功能單元多的指令替換 可分配功能單元少的指令,降低加固帶來(lái)的性能開(kāi)銷,令寄存器Al_c為寄存器Al的副本,令 寄存器42_〇為寄存器A2的副本,自然數(shù)n為立即數(shù),其具體過(guò)程為:
[0080] 4.2.1若MI為''SUBAl,n,A2",貝lJSI等價(jià)變換為''A孤Al_c,-n,A2_c",轉(zhuǎn)4.3。
[0081 ] 4.2.2若MI為''MPYAl,化,A2",貝lJSI等價(jià)變換為''甜LAl_c,n,A2_c",轉(zhuǎn)4.3。
[0082] 4.2.3若11為11¥41,42",貝化1等價(jià)變換為"400 41_。,0,42_。",轉(zhuǎn)4.3。
[0083] 4.2.4就〇為'證30 41",則51等價(jià)變換為乂〇?41_(3,0,31,41_(3",轉(zhuǎn)4.3。
[0084] 4.2.5若MI為''ANDAl,2n-l,A2",則SI等價(jià)變換為乂LRAl_c,n,31,A2_c",轉(zhuǎn)4.3。
[0085] 4.2.6若11為'伽41,2。"-1,42",貝化1等價(jià)變換為''沈141_。,0,11,42_。",轉(zhuǎn)4.3。
[0086] 4.2.7若MI為''0RAl,2n,A2",現(xiàn)JSI等價(jià)變換為''SETAl_c,n,n,A2_c",轉(zhuǎn)4.3。
[0087] 4.2.8若MI為。CMPGTAl,A2,A3",則SI等價(jià)變換為。CMPLTA2_c,Al_c,A3_c",轉(zhuǎn) 4.3。
[008引 4.2.9若MI為。CM化TAl,A2,A3",則SI等價(jià)變換為。CMPGTA2_c,Al_c,A3_c",轉(zhuǎn) 4.3。
[0089] 4.2.10若MI為"CMPGT2A1,A2,A3",則SI等價(jià)變換為"CMPLT2A2_c,Al_c,A3_c",轉(zhuǎn) 4.3。
[0090] 4.2.11若MI為"CMPLT2A1,A2,A3",則SI等價(jià)變換為"CMPGT2A2_c,Al_c,A3_c",轉(zhuǎn) 4.3。
[0091 ] 4.2.12若MI為"CMPGTU4A1,A2,A3",則SI等價(jià)變換為"CMPLTU4A2_c,Al_c,A3_c", 轉(zhuǎn) 4.3。
[0092] 4.2.13若11為^^1;1'1]441,42,43",則51等價(jià)變換為^^61'1]442_。,41_〇,43_。", 轉(zhuǎn) 4.3。
[0093] 4.2.14若MI為。CMPGTSPAl,A2,A3",則SI等價(jià)變換為。CM化TSPA2_c,Al_c,A3_ 〇',轉(zhuǎn)4.3。
[0094] 4.2.15若MI為。CM化TSPAl,A2,A3",則SI等價(jià)變換為。CMPGTSPA2_c,Al_c,A3_ 〇',轉(zhuǎn)4.3。
[0095] 4.2.16若MI為乂MPGTDPAl,A2,A3",則SI等價(jià)變換為乂MPLTDPA2_c,Al_c,A3_ 〇',轉(zhuǎn)4.3。
[0096] 4.2.17若MI為乂MPLTDPAl,A2,A3",則SI等價(jià)變換為乂MPGTDPA2_c,Al_c,A3_ 〇',轉(zhuǎn)4.3。
[0097] 4.2.18若MI不為W上17種情況,則SI與MI使用相同的指令碼,SI中的操作數(shù)為MI 中操作數(shù)的副本,轉(zhuǎn)4.3。
[0098] 4.3判斷SBBiS是否具有標(biāo)志L,若沒(méi)有,執(zhí)行第4.4步,若具有標(biāo)志L,執(zhí)行第4.5步。
[0099] 4.4SBBi6不具有標(biāo)志L,表示此基本塊所在的循環(huán)無(wú)法經(jīng)編譯器排出軟件流水線, 按W下方法添加復(fù)算指令,其具體過(guò)程為:
[0100] 4.4.1判斷SBBis最后一條指令的類型,若為存儲(chǔ)指令,轉(zhuǎn)4.4.3,若為跳轉(zhuǎn)指令,貝U 轉(zhuǎn)4.4.4,既不是存儲(chǔ)指令又不是跳轉(zhuǎn)指令,轉(zhuǎn)4.4.2。
[0101 ] 4.4.2在運(yùn)條指令后插入復(fù)算指令,復(fù)算指令與運(yùn)條指令具有相同的指令碼,復(fù)算 指令中的操作數(shù)為原指令操作數(shù)的副本,轉(zhuǎn)4.6。
[0102] 4.4.3在運(yùn)條指令前插入第=檢測(cè)指令,第=檢測(cè)指令是由一組異或指令和一條 固齡指令組成的指令,其功能是使用異或指令XOR檢測(cè)存儲(chǔ)指令的數(shù)據(jù)、內(nèi)存地址、偏移量、 指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí)程序正常繼續(xù)執(zhí) 行,當(dāng)發(fā)現(xiàn)不一致時(shí),由跳轉(zhuǎn)指令轉(zhuǎn)到錯(cuò)誤處理函數(shù)。令寄存器40_(3為寄存器AO的副本,令 寄存器Al_c為寄存器Al的副本,寄存器42_(3為寄存器A2的副本,寄存器43_(:為寄存器A3的 副本,EQ是儲(chǔ)存檢測(cè)結(jié)果的寄存器,ERR為錯(cuò)誤處理函數(shù),運(yùn)一步的具體過(guò)程為:
[0103] 4.4.3.1在存儲(chǔ)指令之前依次插入比較語(yǔ)句ッ0RAl,Al_c,EQ"、"[!EQ]X0RA2, A2_c,EQ"和錯(cuò)誤處理語(yǔ)句(跳轉(zhuǎn)指令r[EQ]B ERR",A1、A2分別是數(shù)據(jù)操作數(shù)和地址操作 數(shù)。
[0104] 4.4.3.2若存儲(chǔ)指令具有執(zhí)行條件,假設(shè)其存儲(chǔ)在寄存器AO中,則在錯(cuò)誤處理語(yǔ)句 前插入比較語(yǔ)句1 !EQ]X0R AO,A0_c,EQ",轉(zhuǎn)4.4.3.3,若存儲(chǔ)指令沒(méi)有執(zhí)行條件,則直接轉(zhuǎn) 4.4.3.3。
[0105] 4.4.3.3若存儲(chǔ)指令具有偏移地址,假設(shè)其存儲(chǔ)在寄存器A3中,則在錯(cuò)誤處理語(yǔ)句 前插入比較語(yǔ)句T !EQ]X0R A3,A3_c,EQ",轉(zhuǎn)4.6,若存儲(chǔ)指令沒(méi)有偏移地址,則直接轉(zhuǎn)4.6。
[0106] 4.4.4在運(yùn)條指令前插入第四檢測(cè)指令,第四檢測(cè)指令是由一組異或指令和一條 固齡指令組成的指令,其功能是使用異或指令XOR檢測(cè)跳轉(zhuǎn)的地址、指令的執(zhí)行條件等變量 的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí)程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),由 跳轉(zhuǎn)指令轉(zhuǎn)到錯(cuò)誤處理函數(shù)。運(yùn)一步的具體過(guò)程為:
[0107] 4.4.4.1在跳轉(zhuǎn)指令之前依次插入比較語(yǔ)句^OR AO,A0_c,EQ"和錯(cuò)誤處理語(yǔ)句 "[EQ化ERR",A0中存儲(chǔ)的是指令的執(zhí)行條件,轉(zhuǎn)4.4.4.2。
[0108] 4.4.4.2若跳轉(zhuǎn)指令的目的地址存儲(chǔ)在寄存器Al中,則在錯(cuò)誤處理語(yǔ)句前插入比 較語(yǔ)句l!EQ]X0RAl,Al_c,EQ",轉(zhuǎn)4.6,若跳轉(zhuǎn)指令的目的地址沒(méi)有存在寄存器中,則直接 轉(zhuǎn) 4.6。
[0109] 4.5此時(shí)SBBis具有標(biāo)志L,即此基本塊所在的循環(huán)可W經(jīng)編譯器排出軟件流水線, 則采用延遲錯(cuò)誤處理方法,使用一個(gè)寄存器邸ROR記錄循環(huán)內(nèi)部檢測(cè)的錯(cuò)誤,并將運(yùn)些錯(cuò)誤 延遲到循環(huán)結(jié)束再處理。運(yùn)一步的具體過(guò)程為:
[0110] 4.5.1若SBBiS還具有標(biāo)志H,即SBBiS為循環(huán)的第一個(gè)無(wú)存基本塊,則在SBBiS第一條 語(yǔ)句之前插入循環(huán)錯(cuò)誤信息寄存器初始化語(yǔ)句"ZERO ERROR",轉(zhuǎn)4.5.2。若SBBiS不具有標(biāo)志 H,則直接轉(zhuǎn)4.5.2。
[011U 4.5.2若SBBiS還具有標(biāo)志T,即SBBiS為循環(huán)的最后一個(gè)無(wú)存基本塊,則在SBBiS最后 一條語(yǔ)句之后插入調(diào)用錯(cuò)誤處理例程語(yǔ)句"[ERROR化ERR",轉(zhuǎn)4.5.3。若SBBiS不具有標(biāo)志T, 則直接轉(zhuǎn)4.5.3。
[0112] 4.5.3判斷SBBis最后一條指令的類型,若為存儲(chǔ)指令,則轉(zhuǎn)4.5.5;若為跳轉(zhuǎn)指令, 則轉(zhuǎn)4.5.6,若既不是存儲(chǔ)指令也不是跳轉(zhuǎn)指令,轉(zhuǎn)4.5.4。
[0113] 4.5.4為運(yùn)條指令生成副本指令,副本指令和原指令具有相同的指令碼,副本指令 中的操作數(shù)為原指令中操作數(shù)的副本,轉(zhuǎn)4.6。
[0114] 4.5.5在運(yùn)條指令前插入第五檢測(cè)指令,第五檢測(cè)指令是由一組異或指令、一條錯(cuò) 誤信息記錄指令和一條存儲(chǔ)條件無(wú)效化指令組成的指令,其功能是使用異或指令XOR檢測(cè) 存儲(chǔ)指令的數(shù)據(jù)、內(nèi)存地址、偏移量、指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本 的一致性,一致時(shí)程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),采用延遲錯(cuò)誤處理方法將檢測(cè)到的 錯(cuò)誤記錄到邸ROR寄存器中,并在循環(huán)結(jié)束的位置插入循環(huán)錯(cuò)誤判斷的指令,根據(jù)ERROR寄 存器的值進(jìn)行錯(cuò)誤處理。在檢測(cè)到錯(cuò)誤的情況下,為了防止錯(cuò)誤向內(nèi)存?zhèn)鞑?,使該存?chǔ)指令 的執(zhí)行條件為假。運(yùn)一步的具體過(guò)程為:
[0115] 4.5.5.1在存儲(chǔ)指令之前依次插入比較語(yǔ)句ッ0RAl,Al_c,EQ"、"[!EQ]X0RA2, A2_c,EQ"和錯(cuò)誤信息記錄語(yǔ)句1EQ]MVK Oxffff,邸ROr,A1、A2分別是數(shù)據(jù)操作數(shù)和地址 操作數(shù)。
[0116] 4.5.5.2若存儲(chǔ)指令具有執(zhí)行條件,假設(shè)其存儲(chǔ)在寄存器AO中,則在錯(cuò)誤信息記錄 語(yǔ)句前插入比較語(yǔ)句1 !EQ]X0R A0,A0_c,EQ",在存儲(chǔ)指令前插入存儲(chǔ)指令執(zhí)行條件無(wú)效 化語(yǔ)句"[ERROR]Z邸0 AO",轉(zhuǎn)4.5.5.3。若存儲(chǔ)指令不具有執(zhí)行條件,則為運(yùn)條存儲(chǔ)指令添 加執(zhí)行條件"[!ERROR]",使此存儲(chǔ)指令根據(jù)ERROR寄存器的值按條件進(jìn)行存儲(chǔ),轉(zhuǎn)4.5.5.3。
[0117] 4.5.5.3若存儲(chǔ)指令具有偏移地址,假設(shè)其存儲(chǔ)在寄存器A3中,則在錯(cuò)誤信息記錄 語(yǔ)句前插入比較語(yǔ)句1 !EQ]X0R A3,A3_c,EQ",轉(zhuǎn)4.6。若存儲(chǔ)指令不具有偏移地址,則直接 轉(zhuǎn) 4.6。
[0118] 4.5.6在運(yùn)條指令前插入第六檢測(cè)語(yǔ)句,第六檢測(cè)指令是由一組異或指令、一條錯(cuò) 誤信息記錄指令和一條循環(huán)計(jì)數(shù)器清零指令組成的指令,其功能是使用異或指令XOR檢測(cè) 跳轉(zhuǎn)指令的地址、指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí) 程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),采用延遲錯(cuò)誤處理方法將檢測(cè)到的錯(cuò)誤記錄到ERROR 寄存器中,并在循環(huán)結(jié)束的位置插入循環(huán)錯(cuò)誤判斷的指令,根據(jù)ERROR寄存器的值進(jìn)行錯(cuò)誤 處理。在檢測(cè)到錯(cuò)誤的情況下,為了降低錯(cuò)誤處理延遲,將循環(huán)計(jì)數(shù)器清零從而結(jié)束循環(huán)。 運(yùn)一步的具體過(guò)程為:
[0119] 4.5.6.1在跳轉(zhuǎn)指令前依次插入比較語(yǔ)句^OR AO,A0_c,EQ"、錯(cuò)誤信息記錄語(yǔ)句 "[EQ]MVK Oxffff ,ERRO護(hù)和循環(huán)計(jì)數(shù)器清零語(yǔ)句1ERR0R]ZER0 AO",A0中存儲(chǔ)的是指令的 執(zhí)行條件,轉(zhuǎn)4.5.6.2。
[0120] 4.5.6.2若跳轉(zhuǎn)指令的目的地址存儲(chǔ)在寄存器Al中,則在錯(cuò)誤信息記錄語(yǔ)句前插 入比較語(yǔ)句1!EQ]X0R Al,Al_c,EQ",轉(zhuǎn)4.6。若跳轉(zhuǎn)指令的目的地址沒(méi)有存在寄存器中,貝U 直接轉(zhuǎn)4.6。
[0121] 4.6i6 = i6+l。
[0122] 4.7判斷i6是否大于N,若是則執(zhí)行第五步,此時(shí)原始代碼已經(jīng)完成加固,否則執(zhí)行 第4.2步。
[0123] 第五步,執(zhí)行添加了錯(cuò)誤檢測(cè)能力的線形匯編程序(即完成了加固的線形匯編程 序),檢測(cè)發(fā)生在運(yùn)行時(shí)的軟錯(cuò)誤,具體步驟為:
[0124] 5.1判斷程序是否檢測(cè)出了軟錯(cuò)誤,若是則執(zhí)行第5.3步,否則執(zhí)行第5.2步。
[01巧]5.2程序正常執(zhí)行,轉(zhuǎn)5.7。
[0126] 5.3判斷錯(cuò)誤被檢測(cè)出的位置,若錯(cuò)誤發(fā)生在可被編譯優(yōu)化的循環(huán)外,則執(zhí)行第 5.4步,否則執(zhí)行第5.5步。
[0127] 5.4錯(cuò)誤發(fā)生之后的檢測(cè)指令將此錯(cuò)誤檢測(cè)出,轉(zhuǎn)5.6。
[01%] 5.5循環(huán)內(nèi)的檢測(cè)指令將錯(cuò)誤記錄到ERROR寄存器中,并且跳過(guò)循環(huán)內(nèi)的存儲(chǔ)指 令,清零循環(huán)計(jì)數(shù)器,提前終止循環(huán),轉(zhuǎn)5.6。
[01巧]5.6進(jìn)行錯(cuò)誤處理。
[0130] 5.7 結(jié)束。
[0131] 與已有的DSP程序數(shù)據(jù)錯(cuò)誤檢測(cè)方法相比,采用本發(fā)明可W達(dá)到W下的技術(shù)效果:
[0132] (1)本發(fā)明第四步對(duì)程序進(jìn)行加固是一種純軟件方法,不需要修改底層DSP硬件, 加固后的程序具有軟錯(cuò)誤檢測(cè)能力,不需要操作系統(tǒng)的多線程支持。
[0133] (2)本發(fā)明由于第四步添加的檢測(cè)指令采用的優(yōu)化檢測(cè)指令方法利用了 DSP線形 匯編指令條件執(zhí)行的特點(diǎn),將每個(gè)同步檢查點(diǎn)多次比較和跳轉(zhuǎn)指令合并為多次比較一次跳 轉(zhuǎn),從而顯著降低加固的性能開(kāi)銷。
[0134] (3)本發(fā)明由于第4.2步采用了指令等價(jià)性變換方法,用指令執(zhí)行周期少的指令替 換指令執(zhí)行周期多者,用可選功能單元較多的等價(jià)指令替換可選功能單元較少者,更有利 于防止因功能單元分配不均導(dǎo)致的流水線阻塞,從而提高加固后程序的執(zhí)行效率。
[0135] (4)本發(fā)明對(duì)數(shù)據(jù)錯(cuò)誤的檢測(cè)率很高,能夠檢測(cè)出很多硬件瞬時(shí)故障引起的程序 軟錯(cuò)誤。同時(shí)本發(fā)明由于第4.2步采用指令等價(jià)變換方法對(duì)部分指令進(jìn)行指令差異性復(fù)算, 指令和其副本可能使用不同的指令碼和功能單元,因此本發(fā)明還能檢測(cè)出一部分硬件故障 引起的持續(xù)性錯(cuò)誤,例如指令譯碼單元的錯(cuò)誤和功能單元的錯(cuò)誤。由于采用了指令差異性 復(fù)算,提高了原始指令和復(fù)算指令之間的差異性,達(dá)到了最大限度暴露軟錯(cuò)誤的目的,使得 本發(fā)明的數(shù)據(jù)錯(cuò)誤檢測(cè)率明顯提高,在99.4 % W上。
[0136] (5)本發(fā)明由于第4.5步引入了延遲錯(cuò)誤處理方法,針對(duì)循環(huán)內(nèi)部的檢查點(diǎn)會(huì)引入 控制跳轉(zhuǎn)語(yǔ)句從而破壞循環(huán)軟件流水線的建立運(yùn)一影響性能的關(guān)鍵問(wèn)題,使用一個(gè)寄存器 ERROR存儲(chǔ)循環(huán)內(nèi)部是否檢測(cè)到錯(cuò)誤運(yùn)一信息,不是在循環(huán)內(nèi)部檢測(cè)到錯(cuò)誤后立即跳轉(zhuǎn)到 錯(cuò)誤處理例程,而是等到循環(huán)結(jié)束后再根據(jù)邸ROR寄存器的信息去進(jìn)行錯(cuò)誤處理。使得添加 了數(shù)據(jù)錯(cuò)誤檢測(cè)功能的程序循環(huán)結(jié)構(gòu)依然可W像加固前一樣建立軟件流水線,在不降低錯(cuò) 誤檢測(cè)率的同時(shí)W-定的錯(cuò)誤處理延遲為代價(jià),顯著提高了加固后程序的執(zhí)行速度,降低 了性能開(kāi)銷。
[0137] (6)本發(fā)明由于第四步結(jié)合使用了=大指令差異性變換方法:指令等價(jià)變換、優(yōu)化 檢測(cè)指令、延遲錯(cuò)誤處理,顯著提高了加固后代碼的執(zhí)行效率,降低了加固帶來(lái)的性能開(kāi) 銷,同時(shí)增加指令之間的差異性,達(dá)到最大限度暴露故障的目的,提高了故障檢測(cè)率。
【附圖說(shuō)明】
[013引圖1是本發(fā)明的總流程圖;
[0139] 圖2是本發(fā)明的第二步基于無(wú)存基本塊序列SBBi,SBB2,- 'SBBn,構(gòu)造程序控制流圖 G(V,E)的流程圖;
[0140] 圖3是本發(fā)明的第=步基于G(V,E),找到程序中所有可被編譯優(yōu)化的循環(huán),并為運(yùn) 些循環(huán)的無(wú)存基本塊做標(biāo)識(shí)的流程圖;
[0141] 圖4是本發(fā)明的第四步對(duì)程序進(jìn)行加固,即為無(wú)存基本塊序列SBBi,SBB2,…SBBn添 加合適的復(fù)算指令和檢測(cè)指令的流程圖;
[0142] 圖5是本發(fā)明的第五步執(zhí)行完成了加固的線形匯編程序,檢測(cè)發(fā)生在運(yùn)行時(shí)的軟 錯(cuò)誤的流程圖;
[0143] 圖6是本發(fā)明的第3.1步從Vi開(kāi)始采用深度優(yōu)先捜索遍歷G(V,E),得到一個(gè)樹(shù)形結(jié) 構(gòu)T,T的葉節(jié)點(diǎn)是程序執(zhí)行結(jié)束的節(jié)點(diǎn)或者是G(V,E)的深度優(yōu)先捜索已經(jīng)遍歷過(guò)的節(jié)點(diǎn)的 流程圖。
【具體實(shí)施方式】
[0144] 圖1是本發(fā)明的總流程圖,主要包括W下五個(gè)步驟:
[0145] 1.將線形匯編源程序劃分為無(wú)存基本塊序列SBBi,SB化,一SBBnd
[0146] 2.基于無(wú)存基本塊序列SBBi,SB化,…SBBn,構(gòu)造程序控制流圖G(V,E)。
[0147] 3.基于程序控制流圖G(V,E),找到程序中所有可被編譯優(yōu)化的循環(huán),并為運(yùn)些循 環(huán)的無(wú)存基本塊做標(biāo)識(shí)。
[0148] 4.對(duì)程序進(jìn)行加固,為每個(gè)無(wú)存基本塊添加合適的復(fù)算指令和檢測(cè)指令。
[0149] 5.執(zhí)行加固后的程序,檢測(cè)發(fā)生在運(yùn)行時(shí)的軟錯(cuò)誤。
[0150] 通過(guò)W上五步,就能實(shí)現(xiàn)DSP線形匯編程序的軟錯(cuò)誤檢測(cè)。
[0151] 圖2是本發(fā)明的第二步基于無(wú)存基本塊序列SBBi,SBB2,…SBBn,構(gòu)造程序控制流圖 G(V,E)的流程圖,主要包括九大步驟:
[0152] 2.1.將每個(gè)無(wú)存基本塊作為G(V,E)的一個(gè)節(jié)點(diǎn)。
[0153] 2.2.令12 = 1。
[0154] 2.3.判斷SBBi2最后一條指令的類型,若為無(wú)條件跳轉(zhuǎn)指令則執(zhí)行第2.4步,若為條 件跳轉(zhuǎn)指令則執(zhí)行第2.5步,若為函數(shù)調(diào)用指令則執(zhí)行第2.7步,否則為普通指令,執(zhí)行第 2.6 步。
[01W] 2.4.在G(V,E)中添加一條節(jié)點(diǎn)SBBi2到轉(zhuǎn)移目標(biāo)所在的基本塊節(jié)點(diǎn)的有向邊,轉(zhuǎn) 2.8 步。
[0156] 2.5.在6(¥,6)中添加一條節(jié)點(diǎn)58812到轉(zhuǎn)移目標(biāo)所在的基本塊節(jié)點(diǎn)的有向邊,并且 添加一條節(jié)點(diǎn)58812到節(jié)點(diǎn)58812+1的有向邊,轉(zhuǎn)2.8步。
[0157] 2.6.在6八6)中添加一條節(jié)點(diǎn)58812到節(jié)點(diǎn)58812+1的有向邊,轉(zhuǎn)第2.8步。
[015引2.7.在6(¥,6)中從58812向被調(diào)用函數(shù)的入口無(wú)存基本塊畫一條有向邊,并且從被 調(diào)用函數(shù)的退出無(wú)存基本塊向SBBi2+i畫一條有向邊,表示函數(shù)返回的控制流轉(zhuǎn)移,轉(zhuǎn)2.8 步。
[0159] 2.8.i2 = i2+l。
[0160] 2.9.判斷i2是否大于N,若是則得到G(V,E),執(zhí)行第S步,否則執(zhí)行第2.3步。
[0161] 圖3是本發(fā)明的第=步基于G(V,E),找到程序中所有可被編譯優(yōu)化的循環(huán),并為運(yùn) 些循環(huán)的無(wú)存基本塊做標(biāo)識(shí)的流程圖,主要包括四大步驟:
[0162] 3.1.從Vi開(kāi)始采用深度優(yōu)先捜索遍歷G(V,E),得到一個(gè)樹(shù)形結(jié)構(gòu)T,T的葉節(jié)點(diǎn)是 程序執(zhí)行結(jié)束的節(jié)點(diǎn)或者是G(V,E)的深度優(yōu)先捜索已經(jīng)遍歷過(guò)的節(jié)點(diǎn)。
[0163] 3.2.遍歷樹(shù)形結(jié)構(gòu)T,得到T中所有葉節(jié)點(diǎn)^,L2,…,Lni,N1為T中葉節(jié)點(diǎn)的個(gè)數(shù)。
[0164] 3.3.從每個(gè)葉節(jié)點(diǎn)開(kāi)始,向上捜索,若一個(gè)葉節(jié)點(diǎn)和它的某個(gè)祖先結(jié)點(diǎn)相同,則找 到該祖先節(jié)點(diǎn)到此葉節(jié)點(diǎn)的循環(huán),找到的循環(huán)存放在集合LOOP中。
[0165] 3.4.從集合LOOP中篩選出可被編譯優(yōu)化的循環(huán),并為運(yùn)些循環(huán)的無(wú)存基本塊做標(biāo) 識(shí),轉(zhuǎn)第四步。可被編譯優(yōu)化的循環(huán)是指在G(V,E)中除頭節(jié)點(diǎn)具有多個(gè)入度外,其余節(jié)點(diǎn)入 度為1,除尾節(jié)點(diǎn)具有多出度外,其余節(jié)點(diǎn)出度為1的循環(huán)。
[0166] 圖4是本發(fā)明的第四步對(duì)程序進(jìn)行加固,為每個(gè)無(wú)存基本塊添加合適的復(fù)算指令 和檢測(cè)指令的流程圖,主要包括屯大步驟:
[0167] 4.1.令 16 = 1。
[0168] 4.2.對(duì)SBBiS除最后一條指令外的所有源程序指令MI,生成相應(yīng)的副本指令SI插入 到對(duì)應(yīng)的M巧旨令后面,采用指令等價(jià)變換方法對(duì)部分指令進(jìn)行復(fù)算。
[0169] 4.3.判斷SBBiS是否具有標(biāo)志L,若沒(méi)有,執(zhí)行第4.4步,若具有標(biāo)志L,執(zhí)行第4.5步。
[0170] 4.4. SBBis不具有標(biāo)志L,表示此基本塊所在的循環(huán)無(wú)法經(jīng)編譯器排出軟件流水線, 按W下方法添加復(fù)算指令,其具體過(guò)程為:
[0171] 4.4.1.判斷SBBis最后一條指令的類型,若為存儲(chǔ)指令,轉(zhuǎn)4.4.3,若為跳轉(zhuǎn)指令,貝U 轉(zhuǎn)4.4.4,既不是存儲(chǔ)指令又不是跳轉(zhuǎn)指令,轉(zhuǎn)4.4.2。
[0172] 4.4.2.在運(yùn)條指令后插入復(fù)算指令,復(fù)算指令與運(yùn)條指令具有相同的指令碼,復(fù) 算指令中的操作數(shù)為原指令操作數(shù)的副本,轉(zhuǎn)4.6。
[0173] 4.4.3.在運(yùn)條指令前插入第=檢測(cè)指令,第=檢測(cè)指令是由一組異或指令和一條 固齡指令組成的指令,其功能是使用異或指令XOR檢測(cè)存儲(chǔ)指令的數(shù)據(jù)、內(nèi)存地址、偏移量、 指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí)程序正常繼續(xù)執(zhí) 行,當(dāng)發(fā)現(xiàn)不一致時(shí),由跳轉(zhuǎn)指令轉(zhuǎn)到錯(cuò)誤處理函數(shù)。轉(zhuǎn)第4.6步。
[0174] 4.4.4.在運(yùn)條指令前插入第四檢測(cè)指令,第四檢測(cè)指令是由一組異或指令和一條 固齡指令組成的指令,其功能是使用異或指令XOR檢測(cè)跳轉(zhuǎn)的地址、指令的執(zhí)行條件等變量 的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí)程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),由 跳轉(zhuǎn)指令轉(zhuǎn)到錯(cuò)誤處理函數(shù)。轉(zhuǎn)第4.6步。
[0175] 4.5.此時(shí)SBBis具有標(biāo)志L,即此基本塊所在的循環(huán)可W經(jīng)編譯器排出軟件流水線, 則采用延遲錯(cuò)誤處理方法,使用一個(gè)寄存器邸ROR記錄循環(huán)內(nèi)部檢測(cè)的錯(cuò)誤,并將運(yùn)些錯(cuò)誤 延遲到循環(huán)結(jié)束再處理。運(yùn)一步的具體過(guò)程為:
[0176] 4.5.1.若SBBiS還具有標(biāo)志H,即SBBiS為循環(huán)的第一個(gè)無(wú)存基本塊,則在SBBiS第一 條語(yǔ)句之前插入循環(huán)錯(cuò)誤信息寄存器初始化語(yǔ)句"ZERO ERROR",轉(zhuǎn)4.5.2。若SBBiS不具有標(biāo) 志H,則直接轉(zhuǎn)4.5.2。
[0177] 4.5.2.若SBBiS還具有標(biāo)志T,即SBBiS為循環(huán)的最后一個(gè)無(wú)存基本塊,則在SBBiS最 后一條語(yǔ)句之后插入調(diào)用錯(cuò)誤處理例程語(yǔ)句"[ERROR化ERR",轉(zhuǎn)4.5.3。若SBBiS不具有標(biāo)志 T,則直接轉(zhuǎn)4.5.3。4.5.3.判斷SBBiS最后一條指令的類型,若為存儲(chǔ)指令,則轉(zhuǎn)4.5.5;若為 跳轉(zhuǎn)指令,則轉(zhuǎn)4.5.6,若既不是存儲(chǔ)指令也不是跳轉(zhuǎn)指令,轉(zhuǎn)4.5.4。
[0178] 4.5.4.為運(yùn)條指令生成副本指令,副本指令和原指令具有相同的指令碼,副本指 令中的操作數(shù)為原指令中操作數(shù)的副本,轉(zhuǎn)4.6。
[0179] 4.5.5.在運(yùn)條指令前插入第五檢測(cè)指令,第五檢測(cè)指令是由一組異或指令、一條 錯(cuò)誤信息記錄指令和一條存儲(chǔ)條件無(wú)效化指令組成的指令,其功能是使用異或指令XOR檢 測(cè)存儲(chǔ)指令的數(shù)據(jù)、內(nèi)存地址、偏移量、指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版 本的一致性,一致時(shí)程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),采用延遲錯(cuò)誤處理方法將檢測(cè)到 的錯(cuò)誤記錄到邸ROR寄存器中,并在循環(huán)結(jié)束的位置插入循環(huán)錯(cuò)誤判斷的指令,根據(jù)ERROR 寄存器的值進(jìn)行錯(cuò)誤處理。在檢測(cè)到錯(cuò)誤的情況下,為了防止錯(cuò)誤向內(nèi)存?zhèn)鞑?,使該存?chǔ)指 令的執(zhí)行條件為假。轉(zhuǎn)第4.6步。
[0180] 4.5.6.在運(yùn)條指令前插入第六檢測(cè)語(yǔ)句,第六檢測(cè)指令是由一組異或指令、一條 錯(cuò)誤信息記錄指令和一條循環(huán)計(jì)數(shù)器清零指令組成的指令,其功能是使用異或指令XOR檢 測(cè)跳轉(zhuǎn)指令的地址、指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致 時(shí)程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),采用延遲錯(cuò)誤處理方法將檢測(cè)到的錯(cuò)誤記錄到 ERROR寄存器中,并在循環(huán)結(jié)束的位置插入循環(huán)錯(cuò)誤判斷的指令,根據(jù)ERROR寄存器的值進(jìn) 行錯(cuò)誤處理。在檢測(cè)到錯(cuò)誤的情況下,為了降低錯(cuò)誤處理延遲,將循環(huán)計(jì)數(shù)器清零從而結(jié)束 循環(huán)。
[0181] 4.6.i6 = i6+l。
[0182] 4.7.判斷i6是否大于N,若是則執(zhí)行第五步,此時(shí)原始代碼已經(jīng)轉(zhuǎn)換為具有軟錯(cuò)誤 檢測(cè)能力的匯編程序,否則執(zhí)行第4.2步。
[0183] 圖5是本發(fā)明的第五步執(zhí)行加固后的程序,檢測(cè)發(fā)生在運(yùn)行時(shí)的軟錯(cuò)誤的流程圖, 主要包括屯大步驟:
[0184] 5.1.判斷程序是否檢測(cè)出了軟錯(cuò)誤,若是則執(zhí)行第5.3步,否則執(zhí)行第5.2步。
[01化]5.2.程序正常執(zhí)行,轉(zhuǎn)5.7。
[0186] 5.3.判斷錯(cuò)誤被檢測(cè)出的位置,若錯(cuò)誤發(fā)生在可被編譯優(yōu)化的循環(huán)外,則執(zhí)行第 5.4步,否則執(zhí)行第5.5步。
[0187] 5.4.錯(cuò)誤發(fā)生之后的檢測(cè)指令將此錯(cuò)誤檢測(cè)出,轉(zhuǎn)5.6。
[018引5.5.循環(huán)內(nèi)的檢測(cè)指令將錯(cuò)誤記錄至化RROR寄存器中,并且跳過(guò)循環(huán)內(nèi)的存儲(chǔ)指 令,清零循環(huán)計(jì)數(shù)器,提前終止循環(huán),轉(zhuǎn)5.6。
[0189] 5.6.進(jìn)行錯(cuò)誤處理。
[0190] 5.7.結(jié)束。
[0191] 圖6是本發(fā)明的第3.1步從Vi開(kāi)始采用深度優(yōu)先捜索遍歷G(V,E),得到一個(gè)樹(shù)形結(jié) 構(gòu)T,T的葉節(jié)點(diǎn)是程序執(zhí)行結(jié)束的節(jié)點(diǎn)或者是G(V,E)的深度優(yōu)先捜索已經(jīng)遍歷過(guò)的節(jié)點(diǎn)的 流程圖,主要包括九大步驟:
[0192] 3.1.1.建立樹(shù)結(jié)構(gòu)T,令根節(jié)點(diǎn)為Vo。
[0193] 3.1.2.令¥13 = ¥1,¥14 = ¥〇。
[0194] 3.1.3.將Vi3加入樹(shù)形結(jié)構(gòu)T,作為T中Vi4的子節(jié)點(diǎn)。
[01對(duì) 3.1.4.判斷Vi3是否遍歷過(guò),若是則執(zhí)行第3.1.5步,否則執(zhí)行第3.1.6步。
[0196] 3.1.5.令Vi3 = Vi4,Vi4 = Vi4 在T 中的父節(jié)點(diǎn)。
[0197] 3.1.6.判斷是否有從Vi3出發(fā)未被訪問(wèn)的路徑,若有則執(zhí)行第3.1.7步,否則執(zhí)行第 3.1.8 步。
[019引 3.1.7.令Vi4 = Vi3, Vi3 = Vi3通過(guò)運(yùn)條路徑連接的節(jié)點(diǎn),執(zhí)行第3.1.3步。
[0199] 3.1.8.判斷Vi3是否等于Vi,若是則表示得到了 T,轉(zhuǎn)3.2步,否則執(zhí)行第3.1.9步。
[0200] 3.1.9.令Vi3 = Vi4,Vi4 = Vi 廟T 中的父節(jié)點(diǎn),執(zhí)行第3.1.6步。
【主權(quán)項(xiàng)】
1. 一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特征在于包括以下步 驟: 第一步,將程序劃分為N個(gè)無(wú)存基本塊SBB1,SBB2,…SBBn的序列,N為正整數(shù),無(wú)存基本 塊是程序中能夠順序執(zhí)行的指令序列的集合,這組指令序列只有最后一條指令可以是存儲(chǔ) 指令或程序控制指令,這組指令只有一個(gè)入口和一個(gè)出口,入口就是第一條指令,出口就是 最后一條指令; 第二步,基于無(wú)存基本塊序列3881,5882,'"588〃,構(gòu)造程序控制流圖6(¥3),¥為節(jié)點(diǎn)集 合,取值為V1,V2,一VmW1為程序的入口節(jié)點(diǎn),Vm為程序的出口節(jié)點(diǎn),E為邊集合; 第三步,基于G(V,E),找到程序中所有可被編譯優(yōu)化的循環(huán),并為這些循環(huán)的無(wú)存基本 塊做標(biāo)識(shí);可被編譯優(yōu)化的循環(huán)是指除了循環(huán)的第一個(gè)無(wú)存基本塊外沒(méi)有循環(huán)外部到其內(nèi) 部的控制流轉(zhuǎn)移,且除了循環(huán)的最后一個(gè)無(wú)存基本塊外沒(méi)有循環(huán)內(nèi)部到外部的控制流轉(zhuǎn) 移,體現(xiàn)在控制流圖上即循環(huán)除頭節(jié)點(diǎn)具有多個(gè)入度外,其余節(jié)點(diǎn)入度為1,除尾節(jié)點(diǎn)具有 多出度外,其余節(jié)點(diǎn)出度為1;這一步的具體過(guò)程為: 3.1從¥1開(kāi)始采用深度優(yōu)先搜索遍歷6(¥3),得到一個(gè)樹(shù)形結(jié)構(gòu)1',1'的葉節(jié)點(diǎn)是程序執(zhí) 行結(jié)束的節(jié)點(diǎn)或者是G (V,E)的深度優(yōu)先搜索已經(jīng)遍歷過(guò)的節(jié)點(diǎn); 3.2遍歷樹(shù)形結(jié)構(gòu)T,得到T中所有葉節(jié)點(diǎn)L1,L2,…,Ln1,N1為T中葉節(jié)點(diǎn)的個(gè)數(shù); 3.3從每個(gè)葉節(jié)點(diǎn)開(kāi)始,向上搜索,若一個(gè)葉節(jié)點(diǎn)和它的某個(gè)祖先結(jié)點(diǎn)相同,則找到該 祖先節(jié)點(diǎn)到此葉節(jié)點(diǎn)的循環(huán),將找到的循環(huán)存放在集合LOOP中; 3.4從集合LOOP中篩選出可被編譯優(yōu)化的循環(huán),并為這些循環(huán)的無(wú)存基本塊做標(biāo)識(shí);可 被編譯優(yōu)化的循環(huán)是指在G(V,E)中除頭節(jié)點(diǎn)具有多個(gè)入度外,其余節(jié)點(diǎn)入度為1,除尾節(jié)點(diǎn) 具有多出度外,其余節(jié)點(diǎn)出度為1的循環(huán);具體步驟為: 3.4.1判斷LOOP是否為空集,若是則執(zhí)行第四步,否則執(zhí)行第3.4.2步; 3 · 4 · 2選取LOOP 中的一個(gè)循環(huán) I i,LOOP = LOOP- {I i}; 3.4.3判斷Ii是否可被編譯優(yōu)化,若不可則轉(zhuǎn)第3.4.1步,若可被編譯優(yōu)化,執(zhí)行3.4.4 步; 3.4.4為每個(gè)屬于Ii的無(wú)存基本塊做標(biāo)識(shí)L,且為Ii的第一個(gè)和最后一個(gè)無(wú)存基本塊分 別做標(biāo)識(shí)H和T,轉(zhuǎn)3.4.1步; 第四步,對(duì)程序進(jìn)行加固,即為無(wú)存基本塊序列SBB1,SBB2,…SBBn添加復(fù)算指令和檢測(cè) 指令,添加的檢測(cè)指令都采用優(yōu)化檢測(cè)指令方法進(jìn)行優(yōu)化,對(duì)于可被編譯優(yōu)化的循環(huán)采用 延遲錯(cuò)誤處理方法降低加固帶來(lái)的性能開(kāi)銷;第四步的具體過(guò)程為: 4 · 1令i6 = 1; 4.2對(duì)SBBi6除最后一條指令外的所有源程序指令MI,生成相應(yīng)的副本指令SI插入到對(duì) 應(yīng)的MI指令后面,采用指令等價(jià)變換方法對(duì)指令進(jìn)行指令差異性復(fù)算,用執(zhí)行時(shí)間短的指 令替換執(zhí)行時(shí)間長(zhǎng)者,用可分配功能單元多的指令替換可分配功能單元少的指令; 4.3判斷SBBi6是否具有標(biāo)志L,若沒(méi)有,執(zhí)行第4.4步,若具有標(biāo)志L,執(zhí)行第4.5步; 4.4SBBl6不具有標(biāo)志L,表示此基本塊所在的循環(huán)無(wú)法經(jīng)編譯器排出軟件流水線,按以 下方法添加復(fù)算指令,其具體過(guò)程為: 4.4.1判斷SBBi6最后一條指令的類型,若為存儲(chǔ)指令,轉(zhuǎn)4.4.3,若為跳轉(zhuǎn)指令,則轉(zhuǎn) 4.4.4,既不是存儲(chǔ)指令又不是跳轉(zhuǎn)指令,轉(zhuǎn)4.4.2; 4.4.2在這條指令后插入復(fù)算指令,復(fù)算指令與這條指令具有相同的指令碼,復(fù)算指令 中的操作數(shù)為原指令操作數(shù)的副本,轉(zhuǎn)4.6; 4.4.3在這條指令前插入第三檢測(cè)指令,第三檢測(cè)指令是由一組異或指令和一條跳轉(zhuǎn) 指令組成的指令,其功能是使用異或指令XOR檢測(cè)存儲(chǔ)指令的數(shù)據(jù)、內(nèi)存地址、偏移量、指令 執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí)程序正常繼續(xù)執(zhí)行,當(dāng) 發(fā)現(xiàn)不一致時(shí),由跳轉(zhuǎn)指令轉(zhuǎn)到錯(cuò)誤處理函數(shù);令ERR為錯(cuò)誤處理函數(shù),轉(zhuǎn)4.6; 4.4.4在這條指令前插入第四檢測(cè)指令,第四檢測(cè)指令是由一組異或指令和一條跳轉(zhuǎn) 指令組成的指令,其功能是使用異或指令XOR檢測(cè)跳轉(zhuǎn)的地址、指令的執(zhí)行條件等變量的原 始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí)程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),由跳轉(zhuǎn) 指令轉(zhuǎn)到錯(cuò)誤處理函數(shù);轉(zhuǎn)4.6; 4.5此時(shí)58816具有標(biāo)志L,即此基本塊所在的循環(huán)可以經(jīng)編譯器排出軟件流水線,則采 用延遲錯(cuò)誤處理方法,使用一個(gè)寄存器ERROR記錄循環(huán)內(nèi)部檢測(cè)的錯(cuò)誤,并將這些錯(cuò)誤延遲 到循環(huán)結(jié)束再處理;這一步的具體過(guò)程為: 4.5.1若SBBi6還具有標(biāo)志H,即SBBi6為循環(huán)的第一個(gè)無(wú)存基本塊,則在SBB i6第一條語(yǔ)句 之前插入循環(huán)錯(cuò)誤信息寄存器初始化語(yǔ)句"ZERO ERROR",轉(zhuǎn)4.5.2;若SBBi6不具有標(biāo)志H,則 直接轉(zhuǎn)4.5.2; 4.5.2若SBBi6還具有標(biāo)志T,即SBBi6為循環(huán)的最后一個(gè)無(wú)存基本塊,則在SBB i6最后一條 語(yǔ)句之后插入調(diào)用錯(cuò)誤處理例程語(yǔ)句"[ERR0R]B ERR",轉(zhuǎn)4.5.3;若SBBi6不具有標(biāo)志T,則直 接轉(zhuǎn)4.5.3; 4.5.3判斷SBBi6最后一條指令的類型,若為存儲(chǔ)指令,則轉(zhuǎn)4.5.5;若為跳轉(zhuǎn)指令,則轉(zhuǎn) 4.5.6,若既不是存儲(chǔ)指令也不是跳轉(zhuǎn)指令,轉(zhuǎn)4.5.4; 4.5.4為這條指令生成副本指令,副本指令和原指令具有相同的指令碼,副本指令中的 操作數(shù)為原指令中操作數(shù)的副本,轉(zhuǎn)4.6; 4.5.5在這條指令前插入第五檢測(cè)指令,第五檢測(cè)指令是由一組異或指令、一條錯(cuò)誤信 息記錄指令和一條存儲(chǔ)條件無(wú)效化指令組成的指令,其功能是使用異或指令XOR檢測(cè)存儲(chǔ) 指令的數(shù)據(jù)、內(nèi)存地址、偏移量、指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一 致性,一致時(shí)程序正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),采用延遲錯(cuò)誤處理方法將檢測(cè)到的錯(cuò)誤 記錄到ERROR寄存器中,并在循環(huán)結(jié)束的位置插入循環(huán)錯(cuò)誤判斷的指令,根據(jù)ERROR寄存器 的值進(jìn)行錯(cuò)誤處理;在檢測(cè)到錯(cuò)誤的情況下,為了防止錯(cuò)誤向內(nèi)存?zhèn)鞑ィ乖摯鎯?chǔ)指令的執(zhí) 行條件為假;轉(zhuǎn)4.6; 4.5.6在這條指令前插入第六檢測(cè)語(yǔ)句,第六檢測(cè)指令是由一組異或指令、一條錯(cuò)誤信 息記錄指令和一條循環(huán)計(jì)數(shù)器清零指令組成的指令,其功能是使用異或指令XOR檢測(cè)跳轉(zhuǎn) 指令的地址、指令執(zhí)行條件等變量的原始數(shù)據(jù)版本與副本數(shù)據(jù)版本的一致性,一致時(shí)程序 正常繼續(xù)執(zhí)行,當(dāng)發(fā)現(xiàn)不一致時(shí),采用延遲錯(cuò)誤處理方法將檢測(cè)到的錯(cuò)誤記錄到ERROR寄存 器中,并在循環(huán)結(jié)束的位置插入循環(huán)錯(cuò)誤判斷的指令,根據(jù)ERROR寄存器的值進(jìn)行錯(cuò)誤處 理;在檢測(cè)到錯(cuò)誤的情況下,為了降低錯(cuò)誤處理延遲,將循環(huán)計(jì)數(shù)器清零從而結(jié)束循環(huán);轉(zhuǎn) 4.6; 4.6i6 = i6+l; 4.7判斷i6是否大于N,若是則執(zhí)行第五步,否則執(zhí)行第4.2步; 第五步,執(zhí)行完成了加固的線形匯編程序,檢測(cè)發(fā)生在運(yùn)行時(shí)的軟錯(cuò)誤,具體步驟為: 5.1判斷程序是否檢測(cè)出了軟錯(cuò)誤,若是則執(zhí)行第5.3步,否則執(zhí)行第5.2步; 5.2程序正常執(zhí)行,轉(zhuǎn)5.7; 5.3判斷錯(cuò)誤被檢測(cè)出的位置,若錯(cuò)誤發(fā)生在可被編譯優(yōu)化的循環(huán)外,則執(zhí)行第5.4步, 否則執(zhí)行第5.5步; 5.4錯(cuò)誤發(fā)生之后的檢測(cè)指令將此錯(cuò)誤檢測(cè)出,轉(zhuǎn)5.6; 5.5循環(huán)內(nèi)的檢測(cè)指令將錯(cuò)誤記錄到ERROR寄存器中,并且跳過(guò)循環(huán)內(nèi)的存儲(chǔ)指令,清 零循環(huán)計(jì)數(shù)器,提前終止循環(huán),轉(zhuǎn)5.6; 5.6進(jìn)行錯(cuò)誤處理; 5.7結(jié)束。2. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第二步所述基于無(wú)存基本塊序列SBBl,SBB2,…SBBN,構(gòu)造 G(V,E)的具體過(guò)程為:2.1 將每個(gè)無(wú)存基本塊作為G (V,E)的一個(gè)節(jié)點(diǎn); 2.2 令 i2 = l; 2.3判斷SBB12最后一條指令的類型,若為無(wú)條件跳轉(zhuǎn)指令則執(zhí)行第2.4步,若為條件跳 轉(zhuǎn)指令則執(zhí)行第2.5步,若為函數(shù)調(diào)用指令則執(zhí)行第2.7步,否則為普通指令,執(zhí)行第2.6步; 2.4在G(V,E)中添加一條節(jié)點(diǎn)SBB i2到轉(zhuǎn)移目標(biāo)所在的基本塊節(jié)點(diǎn)的有向邊,轉(zhuǎn)2.8步; 2.5在G(V,E)中添加一條節(jié)點(diǎn)SBBi2到轉(zhuǎn)移目標(biāo)所在的基本塊節(jié)點(diǎn)的有向邊,并且添加 一條節(jié)點(diǎn)SBBi2到節(jié)點(diǎn)SBBi2+j^有向邊,轉(zhuǎn)2.8步; 2.6在G (V,E)中添加一條節(jié)點(diǎn)SBBi2到節(jié)點(diǎn)SBBi2+1的有向邊,轉(zhuǎn)第2.8步; 2.7在G(V,E)中從SBBi2向被調(diào)用函數(shù)的入口無(wú)存基本塊畫一條有向邊,并且從被調(diào)用 函數(shù)的退出無(wú)存基本塊向SBBl2+1畫一條有向邊,表示函數(shù)返回的控制流轉(zhuǎn)移,轉(zhuǎn)2.8步; 2.8i2 = i2+l; 2.9判斷12是否大于1若是則得到6以3);否則執(zhí)行第2.3步。3. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第三步的3.1步所述從Vi開(kāi)始深度優(yōu)先搜索遍歷G(V,E),得到樹(shù)形結(jié)構(gòu)T的具體步驟 為: 3.1.1建立樹(shù)結(jié)構(gòu)T,令根節(jié)點(diǎn)為V0; 3.1.2令Vi3 = V1^=Vo; 3.1.3將Vi3加入樹(shù)形結(jié)構(gòu)T,作為T中Vi4的子節(jié)點(diǎn); 3.1.4判斷V13是否遍歷過(guò),若是則執(zhí)行第3.1.5步,否則執(zhí)行第3.1.6步; 3.1.5令Vi3 = Vi4, Vi4=Vi4 在T 中的父節(jié)點(diǎn); 3.1.6判斷是否有從V13出發(fā)未被訪問(wèn)的路徑,若有則執(zhí)行第3.1.7步,否則執(zhí)行第3.1.8 步; 3.1.7令Vi4=Vi3,Vi3 = Vi3通過(guò)這條路徑連接的節(jié)點(diǎn),執(zhí)行第3.1.3步; 3.1.8判斷V13是否等于化,若是則表示得到了 T,結(jié)束,否則執(zhí)行第3.1.9步; 3.1.9令Vi3 = Vi4,Vi4=Vi4在T中的父節(jié)點(diǎn),執(zhí)行第3.1.6步。4. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第三步的3.3步所述從每個(gè)葉節(jié)點(diǎn)開(kāi)始,向上搜索,將找到的循環(huán)存放在集合LOOP中 的具體步驟為: 3.3.1令15 = 1,集合1^〇(沖=0; 3.3.2令Lf = Li5的父節(jié)點(diǎn); 3.3.3判斷Lf是否等于L15,若不等于則轉(zhuǎn)3.3.4,若等于則找到一條從Lf到L 15的循環(huán),加 入到集合LOOP中; 3.3.4判斷Lf是否等于樹(shù)T的根節(jié)點(diǎn)Vo,若是則i5 = i5+l,轉(zhuǎn)3.3.5步,否則令Lf = Lf在T中 的父節(jié)點(diǎn),執(zhí)行第3.3.3步; 3.3.5判斷i5是否大于Nl,若是則表示搜索完畢,結(jié)束,否則執(zhí)行第3.3.2步。5. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第四步的4.2步所述采用指令等價(jià)變換方法對(duì)指令進(jìn)行指令差異性復(fù)算的具體過(guò)程 如下,其中寄存器Al_c為寄存器Al的副本,寄存器A2_cS寄存器A2的副本,自然數(shù)η為立即 數(shù): 4.2.1若肌為"31^41,1^2",則51等價(jià)變換為100厶1_(:,-1^2_(3",結(jié)束; 4.2.2若肌為"10^41,211,42",則31等價(jià)變換為"31八1_(3,11,42_(3",結(jié)束; 4.2.3若[為"1^厶1,42",則31等價(jià)變換為100 41_〇,0,42_〇",結(jié)束; 4.2.4若MI為"ZERO Α1",則SI等價(jià)變換為"CLR △1_(3,0,31,八1_(:",結(jié)束; 4.2.5若MI為"AND Al,2n-1,A2",則SI等價(jià)變換為"CLR Al_c,n,31,A2_c",結(jié)束; 4 · 2 ·6若MI為 "OR Al,2n+1-l,A2",則SI等價(jià)變換為 "SET Al_c,0,n,A2_c",結(jié)束; 4·2·7若MI為"0RAl,2n,A2",則SI等價(jià)變換為"SETAl_c,n,n,A2_c",結(jié)束 ; 4.2.8若MI為"CMPGT A1,A2,A3",則SI等價(jià)變換為"CMPLT A2_c,Al_c,A3_c",結(jié)束; 4.2.9若肌為"〇1031^八1,厶2,厶3",則51等價(jià)變換為"〇10^了八2_(:,厶1_(3,厶3_(3",結(jié)束 ; 4 · 2 · 10若MI為 "CMPGT2A1,A2,A3",則SI等價(jià)變換為 "CMPLT2A2_c,Al_c,A3_c",結(jié)束; 4 · 2 · 11若MI為 "CMPLT2A1,A2,A3",則SI等價(jià)變換為 "CMPGT2A2_c,Al_c,A3_c",結(jié)束; 4 · 2 · 12若MI為 "CMPGTU4A1,A2,A3",則SI等價(jià)變換為 "CMPLTU4A2_c,Al_c,A3_c",結(jié)束; 4 · 2 · 13若MI為 "CMPLTU4A1,A2,A3",則SI等價(jià)變換為 "CMPGTU4A2_c,Al_c,A3_c",結(jié)束; 4.2.14若羾為"〇10^了5?八1,八2,八3",則51等價(jià)變換為"〇1031^5?八2_(:,八1_(3,八3_(3",結(jié) 束; 4.2.15若羾為"〇1031^5?八1,八2,八3",則51等價(jià)變換為"〇10^了5?八2_(:,八1_(3,八3_(3",結(jié) 束; 4.2.16若羾為"〇10^了0?厶1,厶2,厶3",則51等價(jià)變換為"〇1031^0?厶2_(:,厶1_(3,厶3_(3",結(jié) 束; 4.2.17若羾為"〇1031^0?八1,八2,八3",則51等價(jià)變換為"〇10^了0?八2_(:,八1_(3,八3_(3",結(jié) 束; 4.2.18若MI不為以上17種情況,則SI與MI使用相同的指令碼,SI中的操作數(shù)為MI中操 作數(shù)的副本,結(jié)束。6. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第四步的4.4.3步所述在指令前插入第三檢測(cè)指令的具體過(guò)程為: 4 · 4 · 3 · 1在存儲(chǔ)指令之前依次插入比較語(yǔ)句"XOR Al,Al_c,EQ"、"[ !EQ]X0R A2,A2_c, EQ"和錯(cuò)誤處理語(yǔ)句"[EQ]B ERR",A1、A2分別是數(shù)據(jù)操作數(shù)和地址操作數(shù); 4.4.3.2若存儲(chǔ)指令具有執(zhí)行條件,假設(shè)其存儲(chǔ)在寄存器AO中,則在錯(cuò)誤處理語(yǔ)句前插 入比較語(yǔ)句"[!EQ]XOR AO,A0_c,EQ",轉(zhuǎn)4.4.3.3,若存儲(chǔ)指令沒(méi)有執(zhí)行條件,則直接轉(zhuǎn) 4.4.3.3; 4.4.3.3若存儲(chǔ)指令具有偏移地址,假設(shè)其存儲(chǔ)在寄存器A3中,則在錯(cuò)誤處理語(yǔ)句前插 入比較語(yǔ)句"[!EQ]XOR A3,A3_c,EQ",結(jié)束,若存儲(chǔ)指令沒(méi)有偏移地址,則直接結(jié)束。7. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第四步的4.4.4步所述在指令前插入第四檢測(cè)指令的具體過(guò)程為: 4.4.4.1在跳轉(zhuǎn)指令之前依次插入比較語(yǔ)句"XOR AO,A0_c,EQ"和錯(cuò)誤處理語(yǔ)句"[EQ]B ERR",A0中存儲(chǔ)的是指令的執(zhí)行條件,轉(zhuǎn)4.4.4.2; 4.4.4.2若跳轉(zhuǎn)指令的目的地址存儲(chǔ)在寄存器Al中,則在錯(cuò)誤處理語(yǔ)句前插入比較語(yǔ) 句"[!EQ]XOR Al,Al_c,EQ",結(jié)束,若跳轉(zhuǎn)指令的目的地址沒(méi)有存在寄存器中,則直接結(jié)束。8. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第四步的4.5.5步所述在指令前插入第五檢測(cè)指令的具體過(guò)程為: 4.5.5.1在存儲(chǔ)指令之前依次插入比較語(yǔ)句"XOR Al,Al_c,EQ"、"[ !EQ]XOR A2,A2_c, EQ"和錯(cuò)誤信息記錄語(yǔ)句"[EQ]MVK Oxffff ,ERROR",Al、A2分別是數(shù)據(jù)操作數(shù)和地址操作 數(shù); 4.5.5.2若存儲(chǔ)指令具有執(zhí)行條件,假設(shè)其存儲(chǔ)在寄存器AO中,則在錯(cuò)誤信息記錄語(yǔ)句 前插入比較語(yǔ)句"[!EQ]X0R AO,A0_c,EQ",在存儲(chǔ)指令前插入存儲(chǔ)指令執(zhí)行條件無(wú)效化語(yǔ) 句"[ERROR]ZERO A0",轉(zhuǎn)4.5.5.3;若存儲(chǔ)指令不具有執(zhí)行條件,則為這條存儲(chǔ)指令添加執(zhí) 行條件"[!ERROR]",使此存儲(chǔ)指令根據(jù)ERROR寄存器的值按條件進(jìn)行存儲(chǔ),轉(zhuǎn)4.5.5.3; 4.5.5.3若存儲(chǔ)指令具有偏移地址,假設(shè)其存儲(chǔ)在寄存器A3中,則在錯(cuò)誤信息記錄語(yǔ)句 前插入比較語(yǔ)句"[!EQ]X0R A3,A3_c,EQ",結(jié)束;若存儲(chǔ)指令不具有偏移地址,則直接結(jié)束。9. 如權(quán)利要求1所述的一種基于線形匯編指令差異性變換的DSP軟錯(cuò)誤檢測(cè)方法,其特 征在于第四步的4.5.6步所述在指令前插入第六檢測(cè)語(yǔ)句的具體過(guò)程為: 4.5.6.1在跳轉(zhuǎn)指令前依次插入比較語(yǔ)句"XOR AO,A0_c,EQ"、錯(cuò)誤信息記錄語(yǔ)句"[EQ] MVK Oxffff ,ERROR"和循環(huán)計(jì)數(shù)器清零語(yǔ)句"[ERR0R]ZER0 A0",A0中存儲(chǔ)的是指令的執(zhí)行 條件,轉(zhuǎn)4.5.6.2; 4.5.6.2若跳轉(zhuǎn)指令的目的地址存儲(chǔ)在寄存器Al中,則在錯(cuò)誤信息記錄語(yǔ)句前插入比 較語(yǔ)句"[!EQ]X0R Al,Al_c,EQ",結(jié)束;若跳轉(zhuǎn)指令的目的地址沒(méi)有存在寄存器中,則直接 結(jié)束。
【文檔編號(hào)】G06F11/22GK106021040SQ201610290829
【公開(kāi)日】2016年10月12日
【申請(qǐng)日】2016年5月4日
【發(fā)明人】譚慶平, 邵則銘, 徐建軍, 寧洪, 姜晶菲, 孟憲凱, 張南, 鄧錦洲, 曾平, 張浩宇
【申請(qǐng)人】中國(guó)人民解放軍國(guó)防科學(xué)技術(shù)大學(xué)