張振興,陳志強(qiáng),孫二敬
(1.北京全路通信信號(hào)研究設(shè)計(jì)院集團(tuán)有限公司,北京 100070;2.北京市高速鐵路運(yùn)行控制系統(tǒng)工程技術(shù)研究中心,北京 100070)
鐵路信號(hào)系統(tǒng)是保障列車安全運(yùn)行,提高運(yùn)輸效率的重要行車控制系統(tǒng),是保證列車運(yùn)行安全、有序、高效的關(guān)鍵,是國(guó)內(nèi)鐵路技術(shù)體系和裝備現(xiàn)代化的重要組成部分。相關(guān)規(guī)范要求,鐵路信號(hào)系統(tǒng)安全相關(guān)軟件的安全完整性等級(jí)需達(dá)到SIL4 等級(jí)。
根據(jù)EN50128 的描述,安全軟件可采用多樣化編程以達(dá)到要求的安全完整性等級(jí)。多樣化編程是指采用多個(gè)(N)不同的方法實(shí)現(xiàn)多套軟件代碼。相同的輸入值賦給N 套軟件代碼,并對(duì)N 套軟件代碼產(chǎn)生的結(jié)果進(jìn)行比較。如果結(jié)果被認(rèn)為是有效的,結(jié)果被傳輸?shù)接?jì)算機(jī)輸出,否則使系統(tǒng)導(dǎo)向安全側(cè)。當(dāng)N=2 時(shí),該方法指的是雙代碼。
雙代碼開發(fā)的目的是在程序執(zhí)行過程中檢測(cè)軟件設(shè)計(jì)錯(cuò)誤,以防止安全性系統(tǒng)出現(xiàn)嚴(yán)重故障,提高軟件的安全性。
雙代碼開發(fā)方法的基本原則是針對(duì)同一軟件需求,由獨(dú)立的兩個(gè)開發(fā)團(tuán)隊(duì),采用雙套異構(gòu)安全冗余的方法實(shí)現(xiàn)A 和B 兩套代碼,然后對(duì)A/B 代碼的執(zhí)行結(jié)果進(jìn)行比較,比較結(jié)果不一致則使系統(tǒng)導(dǎo)向安全側(cè)。
安全軟件的雙代碼結(jié)構(gòu)即雙套異構(gòu)安全冗余的程序結(jié)構(gòu),可分為全套雙代碼比較結(jié)構(gòu)和關(guān)鍵功能監(jiān)控雙代碼結(jié)構(gòu),全套雙代碼結(jié)構(gòu)又可以分為整體運(yùn)算結(jié)果比較結(jié)構(gòu)和模塊運(yùn)算結(jié)果比較結(jié)構(gòu)。
1)雙代碼整體運(yùn)算結(jié)果比較結(jié)構(gòu)
雙代碼整體運(yùn)算結(jié)果比較的結(jié)構(gòu)如圖1 所示,在軟件的同一個(gè)執(zhí)行周期中先執(zhí)行完整的A 代碼軟件(即A 代碼所有功能模塊)后,再執(zhí)行完整的B代碼軟件(即B 代碼所有功能模塊),然后對(duì)A 代碼軟件的關(guān)鍵運(yùn)算結(jié)果和B 代碼軟件的關(guān)鍵運(yùn)算結(jié)果進(jìn)行比較,最后根據(jù)比較結(jié)果做出相應(yīng)安全反應(yīng),若比較結(jié)果一致,則正常輸出并繼續(xù)運(yùn)行,若比較不一致,則使系統(tǒng)導(dǎo)向安全側(cè)。
圖1 AB代碼整體運(yùn)算結(jié)果比較Fig.1 Comparison for the whole operation results of A/B-code
雙代碼整體運(yùn)算結(jié)果比較結(jié)構(gòu)中,A 代碼軟件和B 代碼軟件源于相同的軟件需求,分別由兩個(gè)相互獨(dú)立的開發(fā)團(tuán)隊(duì)根據(jù)軟件需求進(jìn)行開發(fā),有獨(dú)立的軟件架構(gòu)設(shè)計(jì)、獨(dú)立的功能模塊劃分及獨(dú)立的實(shí)現(xiàn)方法,并且A 代碼軟件和B 代碼軟件的數(shù)據(jù)流相互獨(dú)立,即獨(dú)立的數(shù)據(jù)獲取、獨(dú)立的數(shù)據(jù)處理以及獨(dú)立的輸出,A 代碼軟件和B 代碼軟件的運(yùn)算均不可訪問對(duì)方的數(shù)據(jù)。
雙代碼整體運(yùn)算結(jié)果比較結(jié)構(gòu)不對(duì)A 代碼軟件和B 代碼軟件的運(yùn)算過程數(shù)據(jù)進(jìn)行比較,僅在最后比較關(guān)鍵數(shù)據(jù)和關(guān)鍵輸出。所以該結(jié)構(gòu)不需要A 代碼軟件和B 代碼軟件的功能模塊完全對(duì)等,A 代碼軟件和B 代碼軟件各自的結(jié)構(gòu)設(shè)計(jì)以及功能實(shí)現(xiàn)的耦合度較小,可實(shí)現(xiàn)高度異構(gòu)的雙代碼軟件。
2)模塊運(yùn)算結(jié)果比較結(jié)構(gòu)
模塊運(yùn)算結(jié)果比較的雙代碼結(jié)構(gòu)如圖2 所示,將A 代碼軟件和B 代碼軟件根據(jù)軟件的功能邏輯對(duì)等地拆分為多個(gè)相對(duì)應(yīng)的功能模塊,A 代碼軟件和B 代碼軟件每個(gè)相對(duì)應(yīng)的功能模塊實(shí)現(xiàn)相同的功能,且有相同的輸入數(shù)據(jù)和輸出數(shù)據(jù),按照A 代碼和B代碼模塊交替調(diào)用的方式執(zhí)行并對(duì)模塊關(guān)鍵運(yùn)算結(jié)果進(jìn)行比較,即根據(jù)功能模塊順序先執(zhí)行A 代碼軟件的單個(gè)模塊,然后執(zhí)行B 代碼軟件相應(yīng)的單個(gè)模塊,在A 代碼軟件和B 代碼軟件對(duì)等的單個(gè)模塊均執(zhí)行完成后,對(duì)A/B 代碼對(duì)等模塊的關(guān)鍵運(yùn)算結(jié)果進(jìn)行比較。若比較結(jié)果一致,則繼續(xù)執(zhí)行后續(xù)模塊,若比較不一致,則使系統(tǒng)導(dǎo)向安全側(cè)。
模塊運(yùn)算結(jié)果比較結(jié)構(gòu)中,A 代碼軟件和B 代碼軟件源于相同的軟件需求、相同的軟件架構(gòu)設(shè)計(jì)和相同的模塊劃分,對(duì)等的功能模塊有相應(yīng)的輸入和輸出,但A 代碼軟件和B 代碼軟件功能模塊分別由兩個(gè)相互獨(dú)立的開發(fā)團(tuán)隊(duì)進(jìn)行開發(fā),有獨(dú)立的功能模塊設(shè)計(jì)、邏輯算法、實(shí)現(xiàn)方法。并且A 代碼軟件和B 代碼軟件的數(shù)據(jù)流相互獨(dú)立,A 代碼軟件和B 代碼軟件的運(yùn)算不可相互訪問對(duì)方的數(shù)據(jù)。
模塊運(yùn)算結(jié)果比較結(jié)構(gòu)要求比較模塊級(jí)別的關(guān)鍵運(yùn)算結(jié)果,軟件執(zhí)行的可控程度較高,但A 代碼軟件和B 代碼軟件的模塊劃分、模塊執(zhí)行順序需要一致,異構(gòu)方法主要的體現(xiàn)在功能模塊內(nèi)部,相對(duì)于雙代碼整體運(yùn)算結(jié)果比較結(jié)構(gòu)的可異構(gòu)程度要差一些。
圖2 模塊運(yùn)算結(jié)果比較Fig.2 Comparison of module operation results
3)關(guān)鍵功能運(yùn)算結(jié)果監(jiān)控結(jié)構(gòu)
由于完整的全套A/B 代碼異構(gòu)軟件開發(fā),在軟件需求和方案設(shè)計(jì)時(shí)無法覆蓋所有的運(yùn)行場(chǎng)景和運(yùn)行條件,A/B 代碼采用不同的邏輯設(shè)計(jì)和實(shí)現(xiàn)方法,A 代碼軟件開發(fā)人員和B 代碼軟件開發(fā)人員對(duì)方案設(shè)計(jì)理解的偏差,會(huì)導(dǎo)致在軟件開發(fā)初期出現(xiàn)較多的A/B 代碼運(yùn)算結(jié)果比較不一致,所有的比較不一致均需要深入分析并解決,項(xiàng)目的人力資源投入和時(shí)間投入會(huì)成倍增加,導(dǎo)致項(xiàng)目進(jìn)度相對(duì)較慢;軟件的復(fù)雜度越高,項(xiàng)目的投入會(huì)呈指數(shù)倍增長(zhǎng)。
而對(duì)于一些軟件邊界值處理、邏輯狀態(tài)轉(zhuǎn)換處理及功能優(yōu)先級(jí)的排序等,很容易造成在A 代碼和B 代碼均符合設(shè)計(jì)且處理邏輯均正確的情況下,A/B代碼處理結(jié)果的輸出相差1 個(gè)或者2 個(gè)軟件執(zhí)行周期,或者A/B 代碼的處理結(jié)果均在安全容忍范圍內(nèi)但處理結(jié)果不一致。這些A/B 代碼處理結(jié)果不一致大多數(shù)都發(fā)生在特定場(chǎng)景,在平常測(cè)試中不容易被發(fā)現(xiàn)。軟件現(xiàn)場(chǎng)運(yùn)營(yíng)應(yīng)用后,由于現(xiàn)場(chǎng)運(yùn)營(yíng)環(huán)境的復(fù)雜,導(dǎo)致在運(yùn)營(yíng)過程中遇到這些特殊場(chǎng)景的概率會(huì)增加,且這些特殊運(yùn)營(yíng)場(chǎng)景的觸發(fā)條件可能在運(yùn)營(yíng)一段時(shí)間后才會(huì)出現(xiàn)(由于施工改造、天氣原因等),只要觸發(fā)條件出現(xiàn)后一直存在,則該場(chǎng)景條件觸發(fā)的A/B 代碼處理結(jié)果比較不一致就會(huì)重復(fù)發(fā)生,對(duì)運(yùn)營(yíng)造成較大影響。且可能A/B 代碼軟件對(duì)這些場(chǎng)景條件的處理均符合設(shè)計(jì),給問題分析和解決帶來較大的困難。
根據(jù)相關(guān)的安全軟件編程指導(dǎo)意見,對(duì)復(fù)雜度較高、難以進(jìn)行完整的A/B 雙套異構(gòu)代碼的軟件,可采用在確保獨(dú)立性的前提下增加對(duì)關(guān)鍵條件及關(guān)鍵邏輯運(yùn)算進(jìn)行檢查、校驗(yàn)的程序機(jī)制。即對(duì)于復(fù)雜度較高的軟件,可采用關(guān)鍵功能運(yùn)算結(jié)果監(jiān)控的雙代碼結(jié)構(gòu),如圖3 所示,B 代碼相應(yīng)監(jiān)控模塊對(duì)A 代碼的關(guān)鍵功能和邏輯運(yùn)算結(jié)果進(jìn)行檢查和校驗(yàn)。若檢查到A 代碼運(yùn)算結(jié)果不符合預(yù)期,則使系統(tǒng)導(dǎo)向安全側(cè)。
關(guān)鍵功能運(yùn)算結(jié)果監(jiān)控結(jié)構(gòu)中,僅針對(duì)軟件中較為關(guān)鍵的功能或邏輯算法開發(fā)相應(yīng)的B 代碼監(jiān)控模塊,B 代碼相應(yīng)監(jiān)控模塊的輸入數(shù)據(jù)均從A 代碼模塊中獲取,除了在檢查到A 代碼結(jié)果不符合預(yù)期時(shí)使系統(tǒng)導(dǎo)向安全側(cè)的輸出外,B 代碼監(jiān)控模塊無其他運(yùn)算結(jié)果輸出也不影響A 代碼軟件的輸出。B代碼監(jiān)控模塊具有單獨(dú)的軟件設(shè)計(jì)文檔、軟件測(cè)試規(guī)范和軟件測(cè)試報(bào)告。
關(guān)鍵功能運(yùn)算結(jié)果監(jiān)控結(jié)構(gòu)相對(duì)完整的全套A/B 代碼結(jié)構(gòu)而言較為簡(jiǎn)單,但軟件安全性的提高很大程度上取決于對(duì)軟件關(guān)鍵功能和關(guān)鍵邏輯算法的識(shí)別,監(jiān)控范圍越廣,軟件開發(fā)難度就會(huì)越大;而監(jiān)控范圍過小則會(huì)削弱B 代碼的監(jiān)控效果,從而通過增加B 代碼提高軟件的安全性也得不到應(yīng)有的意義。所以需要對(duì)軟件的安全相關(guān)需求和邏輯算法進(jìn)行更為深入的剖析,準(zhǔn)確識(shí)別出關(guān)鍵功能和關(guān)鍵邏輯算法。
圖3 關(guān)鍵功能模塊運(yùn)算結(jié)果監(jiān)控Fig.3 Monitoring for the operation results of key functional module
同時(shí)可根據(jù)軟件需求規(guī)定被監(jiān)控的關(guān)鍵功能和關(guān)鍵算法中的運(yùn)算條件響應(yīng)優(yōu)先級(jí)、運(yùn)算邊界值、運(yùn)算響應(yīng)時(shí)效等,A 代碼軟件與B 代碼監(jiān)控模塊均按照規(guī)定進(jìn)行設(shè)計(jì)和開發(fā),以減少一些非必要的A/B 代碼運(yùn)算結(jié)果不一致,在不影響安全性的前提下提高可用性。
雙代碼開發(fā)除了通過軟件功能邏輯實(shí)現(xiàn)的獨(dú)立性來提高系統(tǒng)的安全性外,也可通過A 代碼和B 代碼的不同數(shù)據(jù)存儲(chǔ)方式來提高系統(tǒng)的安全性。
A 代碼和B 代碼的全局關(guān)鍵數(shù)據(jù)獨(dú)立存儲(chǔ)在不同的內(nèi)存區(qū)域中,在內(nèi)存中按bit 位取反,結(jié)構(gòu)體類型按照成員變量鏡像排序的方式進(jìn)行定義。例外情況,指針和數(shù)組的索引值在A 和B 代碼中均不需按bit 位取反的。
A 代碼和B 代碼的關(guān)鍵數(shù)據(jù)在內(nèi)存中的表現(xiàn)形式如圖4 所示。
A 代碼和B 代碼的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)體中的成員變量應(yīng)采用鏡像結(jié)構(gòu),如圖5 所示。
圖4 A/B代碼數(shù)據(jù)在內(nèi)存的表現(xiàn)形式Fig.4 Expression form for the memory of A/B-code data
圖5 A/B代碼數(shù)據(jù)結(jié)構(gòu)體的定義方式Fig.5 Definition mode of A/B-code data structure
同時(shí)對(duì)A 代碼和B 代碼的關(guān)鍵數(shù)據(jù)進(jìn)行A 格式和B 格式兩次數(shù)據(jù)比較,其中A 格式比較是將A代碼的關(guān)鍵數(shù)據(jù)進(jìn)行取反后與B 代碼的關(guān)鍵數(shù)據(jù)進(jìn)行比較,B 格式比較是將B 代碼的關(guān)鍵數(shù)據(jù)進(jìn)行取反后與A 代碼的關(guān)鍵數(shù)據(jù)進(jìn)行比較。任一種比較方式的比較結(jié)果不一致,均使系統(tǒng)導(dǎo)向安全側(cè)。
該A/B 代碼數(shù)據(jù)存儲(chǔ)和比較方法,對(duì)于單CPU 結(jié)構(gòu)的系統(tǒng)能夠防止由于內(nèi)存、輸入輸出設(shè)備以及數(shù)據(jù)傳輸過程中其他硬件的錯(cuò)誤導(dǎo)致的安全風(fēng)險(xiǎn),而對(duì)于雙CPU 的二取二和三CPU 的三取二結(jié)構(gòu)的系統(tǒng),也能夠防止硬件共因錯(cuò)誤導(dǎo)致的安全風(fēng)險(xiǎn),大大提高系統(tǒng)的安全性。
雙代碼開發(fā)方法可有效提高鐵路信號(hào)相關(guān)安全軟件的安全性,但會(huì)增加安全軟件開發(fā)投入和開發(fā)周期,同時(shí)也會(huì)降低安全軟件的可用性。對(duì)于不同設(shè)備的安全軟件開發(fā),應(yīng)根據(jù)軟件的安全需求和復(fù)雜程度,在保證安全性的前提下選擇合適的雙代碼開發(fā)方法。