盧利勇 孫壽龍
(北京全路通信信號(hào)研究設(shè)計(jì)院有限公司,北京 100073)
盧利勇,男,碩士畢業(yè)于蘭州交通大學(xué),工程師。主要研究方向包括嵌入式系統(tǒng)設(shè)計(jì)、計(jì)算機(jī)聯(lián)鎖系統(tǒng)開發(fā),曾參與DS6-60故障安全平臺(tái)、全電子計(jì)算機(jī)聯(lián)鎖項(xiàng)目。
隨著軌道交通系統(tǒng)的日新月異發(fā)展,軌道交通系統(tǒng)相關(guān)設(shè)備的需求也日益擴(kuò)大。故障安全平臺(tái),不僅可以應(yīng)用到國(guó)有鐵路的車站聯(lián)鎖控制,還可以應(yīng)用到城市軌道交通信號(hào)控制系統(tǒng)中,如計(jì)算機(jī)聯(lián)鎖系統(tǒng)、區(qū)域控制中心等,還可以作為CTCS-2或CTCS-3系統(tǒng)中的車站列控中心使用,具有廣闊的應(yīng)用前景。
然而軌道交通系統(tǒng)作為大容量公共交通工具,其安全性直接關(guān)系到廣大乘客的生命安全。其中信號(hào)系統(tǒng)作為保證列車安全、正點(diǎn)、快捷、舒適、高密度不間斷運(yùn)行的重要技術(shù)裝備,在軌道交通系統(tǒng)中有著舉足輕重的地位。因此,對(duì)信號(hào)系統(tǒng)其中的故障安全平臺(tái)的安全性提出更高的要求。
在研發(fā)中使用哪些安全防護(hù)技術(shù)更好、更有效,從而使故障安全平臺(tái)更加安全可靠,成為困擾眾多研發(fā)者的問(wèn)題。
本文以DS6-60①DS6-60型故障安全平臺(tái)是北京全路通信信號(hào)研究設(shè)計(jì)院有限公司自主創(chuàng)新研發(fā)的一個(gè)符合歐洲鐵路安全標(biāo)準(zhǔn)的計(jì)算機(jī)聯(lián)鎖系統(tǒng)。該系統(tǒng)采用二乘二取二冗余結(jié)構(gòu)設(shè)計(jì), 系統(tǒng)中所有涉及到安全信息處理和傳輸?shù)牟考凑铡肮收?安全”原則采取了2重系結(jié)構(gòu)設(shè)計(jì),滿足鐵路車站信號(hào)控制設(shè)備高可靠和高安全的使用要求?,F(xiàn)已在全路大面積推廣。故障安全平臺(tái)為例,對(duì)二取二安全機(jī)制、工具安全性分析和防御性編程3種關(guān)鍵安全防護(hù)技術(shù)的使用進(jìn)行闡述。
二取二防護(hù)機(jī)制能有效防止單點(diǎn)故障,二取二安全機(jī)制在實(shí)現(xiàn)上還需要注意些什么,下面結(jié)合一個(gè)例子來(lái)說(shuō)明。
如圖1所示,圖1中執(zhí)行模塊的設(shè)計(jì),為了防止一個(gè)CPU發(fā)生故障,誤輸出,使用了雙CPU二取二協(xié)同輸出的方式,CPU1輸出動(dòng)態(tài)脈沖碼,CPU2輸出靜態(tài)電平信號(hào),只有當(dāng)CPU1和CPU2都輸出時(shí),執(zhí)行模塊通過(guò)表決器最終才會(huì)輸出驅(qū)動(dòng)信號(hào)。
下面設(shè)想幾種場(chǎng)景,分析基于以上設(shè)計(jì),是否還有危險(xiǎn)輸出。
1)場(chǎng)景1:CPU1故障一直輸出動(dòng)態(tài)脈沖②CPU1為動(dòng)態(tài)輸出,如果CPU1輸出動(dòng)態(tài)脈沖表示系統(tǒng)本周期有輸出,如果CPU1輸出靜態(tài)電平表示系統(tǒng)本周期無(wú)輸出。。這時(shí)二取二已經(jīng)失效,相當(dāng)于只有CPU2控制輸出。
解決方法:如圖1中線2,CPU1回讀CPU2的輸出信號(hào),CPU1每周期在輸出前,先要檢查CPU2的輸出狀態(tài),只有CPU2有輸出,CPU1才輸出動(dòng)態(tài)脈沖,否則CPU1不輸出。
2)場(chǎng)景2③每一種場(chǎng)景都是基于上一場(chǎng)景提出問(wèn)題已解決,結(jié)構(gòu)已完善的基礎(chǔ)上。:比較器故障。CPU1和CPU2都沒(méi)有輸出,通過(guò)比較器輸出了驅(qū)動(dòng)信號(hào),驅(qū)動(dòng)繼電器誤動(dòng)作。
解決方法:如圖1中線1。CPU2每周期都會(huì)通過(guò)檢測(cè)回讀電路獲得比較器后端的輸出,如果本周期CPU2沒(méi)有輸出,而比較器后端有輸出,CPU2經(jīng)過(guò)過(guò)濾期④過(guò)濾期為系統(tǒng)可容忍的最大時(shí)間,由具體的系統(tǒng)功能確定該時(shí)間。后,做出相應(yīng)的故障安全處理。
3)場(chǎng)景3:CPU2檢測(cè)回讀電路故障。比較器故障后,產(chǎn)生了誤輸出,由于檢測(cè)電路故障,不能及時(shí)發(fā)現(xiàn)。
解決方法:系統(tǒng)在沒(méi)有輸出的周期,產(chǎn)生時(shí)間較短、能量較弱的確保不會(huì)導(dǎo)致現(xiàn)場(chǎng)設(shè)備動(dòng)作的測(cè)試輸出信號(hào),這樣,在沒(méi)有輸出時(shí),通過(guò)測(cè)試輸出信號(hào),及時(shí)發(fā)現(xiàn)檢測(cè)回讀電路的狀態(tài),一旦發(fā)現(xiàn)檢測(cè)回讀電路故障,立即做安全處理,確保不會(huì)誤輸出。
雙CPU同步是二取二實(shí)現(xiàn)的一個(gè)關(guān)鍵問(wèn)題,如圖2所示,DS6-60邏輯部二取二硬件設(shè)計(jì)中,采用同一個(gè)時(shí)鐘源產(chǎn)生時(shí)鐘,然后經(jīng)過(guò)同步中斷產(chǎn)生電路,產(chǎn)生固定周期的中斷信號(hào),為雙CPU任務(wù)級(jí)同步提供硬件支持。為了防止時(shí)鐘源跑偏,每個(gè)CPU除了外部同步中斷計(jì)時(shí),內(nèi)部也有定時(shí)器計(jì)時(shí),每周期開始要對(duì)外部同步中斷計(jì)時(shí)和內(nèi)部定時(shí)器計(jì)時(shí)進(jìn)行校準(zhǔn),確保內(nèi)部和外部計(jì)時(shí)的一致性。
兩個(gè)CPU采用相同的輸入數(shù)據(jù)進(jìn)行獨(dú)立運(yùn)算,運(yùn)算結(jié)果通過(guò)雙口RAM進(jìn)行交互,比較一致時(shí)才可以對(duì)外輸出;如果不一致,系統(tǒng)退出控制,導(dǎo)向安全側(cè),保證系統(tǒng)的高安全性。比較原理如圖3所示。
在軟件開發(fā)的不同階段中,工具對(duì)開發(fā)者都是有很多幫助的。
在開發(fā)DS6-60系統(tǒng)過(guò)程中,使用SVN做文檔和代碼管理,使用了Testbed 做靜態(tài)走查和單元測(cè)試,使用了ADS集成開發(fā)環(huán)境,在ARM芯片上完成調(diào)試和下載等。
根據(jù)EN50128對(duì)工具的分類,T1類工具為不產(chǎn)生任何對(duì)軟件執(zhí)行代碼(包括數(shù)據(jù))影響的工具;T2類工具為支持對(duì)設(shè)計(jì)或執(zhí)行代碼進(jìn)行測(cè)試或驗(yàn)證功能,該類工具中的缺陷可能導(dǎo)致不能有效地發(fā)現(xiàn)設(shè)計(jì)或執(zhí)行代碼的缺陷,但是該類工具不會(huì)直接在執(zhí)行軟件中產(chǎn)生錯(cuò)誤;T3類工具為產(chǎn)生對(duì)安全相關(guān)系統(tǒng)的執(zhí)行代碼(包括數(shù)據(jù))直接或間接有影響的輸出工具。
以上羅列的幾種工具,其中SVN為T1類,Testbed為T2類,ADS為T3類。T3類工具必須進(jìn)行安全性分析,并針對(duì)其可能帶來(lái)的安全風(fēng)險(xiǎn)提供規(guī)避措施。
ADS帶來(lái)的風(fēng)險(xiǎn)如下。
1)ARM C編譯器和ARM C鏈接器生成的目標(biāo)文件邏輯不正確(目標(biāo)文件邏輯上不符合程序源代碼的描述)。
2)ARM C編譯器和ARM C鏈接器在生成的目標(biāo)文件中人為地插入惡意代碼,導(dǎo)致目標(biāo)程序運(yùn)行不可靠或達(dá)到某些其他惡意目的。
3)AXD在將目標(biāo)文件燒寫至ARM芯片時(shí)發(fā)生錯(cuò)誤,芯片中運(yùn)行的程序與目標(biāo)文件邏輯上不一致。
1)使用強(qiáng)類型語(yǔ)言或非強(qiáng)類型語(yǔ)言的安全子集
在DS6-60中使用C語(yǔ)言做為編程語(yǔ)言。C語(yǔ)言屬于非強(qiáng)類型語(yǔ)言,很靈活,卻有很多陷阱。C語(yǔ)言有很多依賴于編譯器的未定義的行為。如:數(shù)據(jù)類型及對(duì)齊方式、數(shù)據(jù)在內(nèi)存的儲(chǔ)存方式等。
SPSS21.0統(tǒng)計(jì)軟件分析數(shù)據(jù),用χ2檢驗(yàn)計(jì)數(shù)資料組間率,計(jì)數(shù)資料用例數(shù)[n(%)]表示,P<0.05為差異具統(tǒng)計(jì)意義。
* ADS開發(fā)環(huán)境C編譯器以上行為分析如表1所示。
表1 ARM C編譯器數(shù)據(jù)類型的大小和對(duì)齊
* ARM C編譯器既支持大端模式,也支持小端模式,默認(rèn)為小端模式。
通過(guò)以上對(duì)編譯器某些行為的分析,故障安全平臺(tái)的軟件開發(fā),在C語(yǔ)言的使用上盡可能少使用與編譯器相關(guān)的行為,使其盡可能的安全可控。如迫不得已使用時(shí),應(yīng)明確編譯器對(duì)應(yīng)行為的處理方式,并應(yīng)將其文檔化。如數(shù)據(jù)類型的轉(zhuǎn)換,必須強(qiáng)制轉(zhuǎn)換,而不是通過(guò)編譯器隱式轉(zhuǎn)換;如有可能會(huì)導(dǎo)致內(nèi)存溢出的strcpy/memcpy等庫(kù)函數(shù),在使用時(shí)需格外小心,保證不會(huì)發(fā)生內(nèi)存溢出。在DS6-60開發(fā)中,使用符合MIRSA C 2004且對(duì)C語(yǔ)言有更多約束的C語(yǔ)言安全子集。
2)采取二取二的安全比較機(jī)制,雙CPU在運(yùn)行中比較邏輯的輸入和輸出值,如不一致,做故障處理。
3)雙CPU采用不同編譯器,防止共模錯(cuò)誤。
數(shù)據(jù)溢出、指針?lè)欠?、關(guān)鍵數(shù)據(jù)被改寫這些安全性問(wèn)題經(jīng)常困擾著軟件開發(fā)工程師,一旦發(fā)生,排查問(wèn)題需要花費(fèi)很多的時(shí)間和精力。防御性編程的使用可以大大增加軟件設(shè)計(jì)的安全性。顧名思義,防御性編程是一種細(xì)致、謹(jǐn)慎的編程方法。防御性編程的目標(biāo)是通過(guò)處理已知的由硬件隨機(jī)性故障或軟件系統(tǒng)性故障引起的軟件故障,從而提供軟件健壯性。
下面從兩個(gè)方面來(lái)說(shuō)明防御性編程:一方面是故障檢測(cè);另一方面是錯(cuò)誤檢測(cè)。
Fun(UINT8_T * pSrc)
{
UINT8_T temp;
temp = g_num ;
…
}
在段代碼中,pSrc指針沒(méi)有任何防護(hù),局部變量也未初始化,局部變量如果不做顯性的初始化,局部變量的初始值是不確定的,完全依賴于編譯器。關(guān)鍵全局變量g_num未做防護(hù)。
修改后的代碼如下。
Fun(const UINT8_T * pSrc)
{
/*參數(shù)合法性校驗(yàn)*/
if(pSrc != NULL)
{
UINT8_T temp = 0U;/*無(wú)符號(hào)型的常量加U*/
/*關(guān)鍵全局變量合法性校驗(yàn)*/
if (g_num <= MAX_NUM)/*MAX_NUM 為g_num的最大合法值*/
{
temp = g_num ;
…
}
else
{
…/*全局變量不合法故障處理*/
}
}
else
{
…/*參數(shù)不合法故障處理*/
}
}
這里說(shuō)明一點(diǎn),并不推薦對(duì)系統(tǒng)的所有全局?jǐn)?shù)據(jù)進(jìn)行合法性校驗(yàn),但是關(guān)鍵全局?jǐn)?shù)據(jù)在使用前應(yīng)加以校驗(yàn)。當(dāng)然故障檢測(cè)除了范圍的檢測(cè),還有資源上的防護(hù)等。比如在軟件中對(duì)關(guān)鍵靜態(tài)變量做周期性的校驗(yàn),防止關(guān)鍵靜態(tài)數(shù)據(jù)被非法改寫。在多任務(wù)的程序設(shè)計(jì)中,應(yīng)當(dāng)慎用共享變量進(jìn)行各任務(wù)間數(shù)據(jù)交換。因?yàn)镃PU對(duì)多任務(wù)程序進(jìn)行調(diào)度執(zhí)行時(shí)可能造成數(shù)據(jù)不一致。確需使用共享變量時(shí)應(yīng)當(dāng)作為臨界資源保護(hù)起來(lái),以控制對(duì)該臨界資源的互斥訪問(wèn)。
比如操作系統(tǒng)與應(yīng)用軟件之間的防護(hù)關(guān)系:一方面操作系統(tǒng)如何保護(hù)應(yīng)用軟件,包括調(diào)度和內(nèi)存等資源管理,并保證不同應(yīng)用軟件運(yùn)行之間不會(huì)沖突等;另一方面應(yīng)用軟件故障/異常行為不會(huì)影響操作系統(tǒng)的正常工作。這些在設(shè)計(jì)階段都需要考慮。
這里所說(shuō)的錯(cuò)誤檢測(cè)專指檢測(cè)通信會(huì)話中出現(xiàn)的數(shù)據(jù)丟失或損壞。一般經(jīng)常使用的檢測(cè)方法為:奇偶校驗(yàn)位、校驗(yàn)和、循環(huán)冗余校驗(yàn)碼等。一般采用檢錯(cuò)重發(fā)技術(shù)。
采用二取二安全機(jī)制時(shí),需要考慮很多故障場(chǎng)景,以便實(shí)現(xiàn)真正意義上的二取二;工具安全性分析,不容易被重視,卻最終可能會(huì)導(dǎo)致故障安全平臺(tái)發(fā)生所謂的“詭異”問(wèn)題,編譯器、鏈接器等工具可能帶來(lái)的風(fēng)險(xiǎn)需要增加防護(hù);防御性編程可以提高軟件的健壯性,對(duì)于使用類似C語(yǔ)言的非強(qiáng)類型語(yǔ)言,建議在使用中對(duì)C語(yǔ)言的行為做出約束,使C語(yǔ)言的行為更加安全可控。
除了上述3種安全防護(hù)措施,在故障安全平臺(tái)研發(fā)中,可能還會(huì)用到其他的安全防護(hù)措施,系統(tǒng)根據(jù)自身的特點(diǎn),選用適合本系統(tǒng)的安全防護(hù)技術(shù),最終使故障安全平臺(tái)安全可靠的運(yùn)行。
[1] EN50128:2011鐵路應(yīng)用:通信、信號(hào)和處理系統(tǒng) 鐵路控制和防護(hù)系統(tǒng)用軟件[S].
[2] EN50129:2003鐵路應(yīng)用:鐵路控制系統(tǒng)領(lǐng)域的安全相關(guān)電子系統(tǒng)[S].