999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

應用EDAC容錯技術的星載軟件堆棧溢出實時檢測方法

2018-09-15 08:38:56張睿周波郝維寧李露銘喬梁
航天器工程 2018年4期

張睿 周波 郝維寧 李露銘 喬梁

(北京空間飛行器總體設計部,北京 100094)

星載軟件是運行在衛星上的嵌入式軟件,典型的星載軟件有數管中心計算機軟件和控制應用軟件。數管中心計算機軟件主要負責整個衛星的數據業務[1],對衛星提供遙測、遙控業務。控制應用軟件主要對衛星進行姿態軌道控制操作。上述軟件按照關鍵等級劃分都屬于A類軟件,其功能對衛星至關重要。堆棧是軟件運行過程中最常用的存儲空間資源之一,堆棧中不僅存放了調用函數傳遞的參數及返回地址,還存放了函數的局部變量。但是,在軟件開發的過程中,對于堆棧的分配及實際使用情況并不能獲得直觀的數據進行比對驗證。堆棧分配過多,會造成星載計算機資源嚴重浪費;分配不足,有可能產生堆棧溢出,造成軟件癱瘓。

對于堆棧深度的檢測,通常分靜態測試方法[2]和動態測試方法。靜態測試方法一般由專用工具提供支持,例如由AbsInt公司開發Stack Analyzer堆棧分析工具。該工具沒有得到廣泛使用,一是由于價格較為昂貴,二是分析過程對函數指針、遞歸邏輯分析等支持不太到位。動態測試方法即在系統運行過程中對軟件使用的堆棧情況進行測試,如上海創景公司的RTInsight工具在和目標系統接口匹配后可用于堆棧的動態測試。另外,也有人通過在系統中設計了專門的測試線程對堆棧進行周期性檢查,通過比對特征字的方式獲取當前堆棧的使用情況,起到了一定的效果[3]。動態測試方法對測試用例的設計要求較高,如果不能分析出堆棧最深的函數調用路徑,即便程序運行相當長的時間,仍然無法獲得堆棧最大使用深度,不能確保后續使用過程中不發生堆棧溢出的問題。對于堆棧溢出的防護技術應用比較廣泛的有StackGuard和StackSheild[4],其原理是對每個函數都加入部分用于調用時創建“哨兵”和返回時進行比對的代碼,由于每個函數調用和返回都要運行這些代碼,因此軟件運行的效率受到比較大的影響,難以滿足星載軟件的實時性要求。

綜上所述,星載軟件開發過程中堆棧使用存在如下問題。①設計師無法掌握堆棧實際使用和余量的情況,憑經驗開辟堆棧空間,普遍存在余量不足或浪費的現象。②堆棧深度檢測困難,靜態測試比較依賴工具,動態測試比較依賴用例設計,效果都難以令人滿意。③軟件在堆棧溢出前不能提前進行預防,無法提供相應的報警或保護措施。④軟件在堆棧溢出后,軟件崩潰時的程序運行位置一般都不在產生溢出的代碼附近,故障的滯后特性使得問題很難排查[5-6]。⑤軟件崩潰后的行為具有不可預測性,存在引起二次故障的風險。另外,也很難設計針對性的防護措施。本文針對上述問題,提出了一種應用EDAC容錯技術的堆棧溢出實時檢測方法,以BM3803處理器為例,介紹其EDAC容錯機制,通過EDAC容錯技術,使星載軟件具備動態、實時檢測堆棧深度和堆棧溢出的能力。

1 BM3803處理器

1.1 堆棧介紹

星載軟件在運行時,其程序和數據在內存中被分為代碼段(Text Section)、數據段等幾個部分,其中,數據段又包括有初值的數據段(Data Section)和無初值的數據段(Bss Section)。內存中剩余的空間被分配給堆空間和棧空間,一般由操作系統對它們進行統一分配和管理。圖1為一個星載軟件內存分配的示意。

圖1 星載軟件內存分配Fig.1 Memory map of on-board software

BM3803是采用SPARC架構的處理器[7],由于其具備錯誤監測與糾正(EDAC)保護機制,對存儲空間具備“糾一檢二”的能力,因此在航天領域廣泛使用。該處理器具有8組窗口寄存器,每組窗口寄存器由8個輸入寄存器、8個本地寄存器和8個輸出寄存器組成,輸入、輸出寄存器主要用于向函數傳遞參數、接收函數的返回值。第6個輸出寄存器保存棧指針(sp),指向當前堆棧的棧頂,不再用于保存程序傳遞參數。因此,輸出寄存器最多可以傳遞6個參數,更多參數通過堆棧傳遞。第6個輸入寄存器保存堆指針(fp),指向當前堆棧的棧底,不再用于保存程序傳遞參數。程序堆棧由堆指針和棧指針組成,堆棧由高地址向低地址方向生長。每個函數所占用的堆棧稱為一個棧幀。如函數A調用函數B,函數B又調用函數C,其堆棧的示意如圖2所示。

在操作系統軟件的支持下,星載軟件一般都由幾個線程承載其功能,每個線程的堆棧都從圖1中的棧空間中分配獲得。線程的堆棧發生溢出,有可能更改了其他線程的堆棧,造成其他線程啟動運行時發生錯誤。

圖2 BM3803處理器堆棧示意Fig.2 Stack of BM3803 processor

1.2 BM3803處理器EDAC保護及造錯機制

BM3803處理器對外部存儲器訪問具有EDAC糾錯檢錯功能,其外部存儲器寬度一般為40 bit,其中32 bit存放程序指令或數據,8 bit存放指令或數據對應的EDAC校驗(BM3803僅產生7 bit校驗),其校驗生成算法參見文獻[7]。當處理器EDAC功能處于使能狀態,讀取存儲器中的數據時,能夠糾正32 bit數據和7 bit校驗中的1 bit錯誤,并能夠檢測2 bit錯誤。本文利用上述保護機制中的檢錯部分,處理器對某地址進行字節寫入或半字寫入操作時,首先需要將包含該字節或半字的32 bit數據和對應的7 bit校驗讀回,將待寫入的字節或半字替換32 bit數據中的相應內容,并重新生成7 bit校驗,最終寫回該地址。在讀取原始數據的過程中,如果該地址存儲的40 bit數據存在2 bit錯誤,則處理器觸發0x2B陷阱。

正常情況下,處理器對外部存儲器進行寫操作時,處理器對待寫入的數據進行EDAC計算,得到校驗,然后將數據連同校驗一起寫入存儲器,此時,數據和校驗是一一對應的。本文方法中,需要利用處理器造錯機制,使寫入的數據和校驗非一一對應,即寫入的40 bit數據存在2 bit錯誤。

造錯機制需要設置BM3803處理器的存儲器容錯配置寄存器1、2、3,具體操作如下。

(1)設置容錯配置寄存器1的寫旁路(EWB)字段,第22位,第20位,第18位分別為0,1,1,使能寫旁路(即對存儲器進行造錯)。

(2)設置容錯配置寄存器2(32 bit數據位對應的翻轉位)、容錯寄存器3(7 bit校驗位對應的翻轉位)對需要造錯的數據位或校驗位進行設置。

(3)操作外部存儲器地址,寫入32 bit數據,此時待寫入的32 bit數據同容錯寄存器2中的32 bit翻轉位進行異或操作,校驗位同容錯寄存器3中的低7 bit翻轉位進行異或操作。處理器把經過異或的數據位和校驗位寫入外部存儲器。

造錯機制的示意如圖3所示。

圖3 BM3803處理器造錯機制示意Fig.3 Error making mechanism of BM3803 processor

2 堆棧溢出實時檢測方法

2.1 檢測原理

本文針對上述問題,提出一種應用EDAC容錯技術的星載軟件堆棧溢出實時檢測方法,以采用BM3803處理器的星載軟件為例,其檢測原理為:運用BM3803處理器對隨機存儲器(RAM)空間的EDAC保護和造錯機制,通過造錯機制在堆棧空間中設置雷區和隔離區(雷區和隔離區僅僅為邏輯區分,實際功能和設置均相同,具體參見第2.2節),并將雷區和隔離區按照4字節地址對齊進行初始化,使每個32 bit數據均存在雙比特錯誤。在軟件運行過程中,隨著棧區的生長,當堆棧超過初始允許范圍并嘗試對雷區進行字節或半字寫操作時,BM3803處理器會立即產生EDAC錯誤陷阱(陷阱號0x2B)。軟件通過掛接相應的陷阱處理程序,獲得陷阱出錯地址,對相應雷區進行清掃,滿足堆棧生長,使軟件可以繼續正常運行,并根據清掃的雷區計算當前堆棧的使用深度。如果堆棧一直生長,直至觸碰隔離區,嘗試對隔離區進行字節或半字寫操作,軟件進入陷阱處理程序后可以通過陷阱出錯地址分析得出該線程即將發生堆棧溢出,并針對堆棧溢出設計有針對性的恢復措施,如主動復位、切換至備份計算機工作等。本文方法中,核心的2個過程是堆棧初始化和陷阱處理(見圖4)。

圖4 堆棧初始化和陷阱處理流程Fig.4 Flow of stack initialization and trap processing

需要說明的是,本文方法觸發陷阱的條件是對雷區和隔離區進行字節或半字寫操作,對應于程序函數中需要存在局部變量,且數據類型為8 bit或16 bit,程序進入雷區后對雷區中存在雙比特錯誤的地址進行讀操作,會引發0x9號陷阱,由于C語言編程規范[8]要求軟件編碼時對所有使用變量進行初始化操作,軟件不應存在對局部變量未初始化就進行讀取使用的操作,因此不會產生0x9號陷阱。同樣的,規范中要求對局部變量進行初始化,對應于程序函數中定義的所有局部變量(包括8 bit或16 bit變量),都需要進行賦值寫操作。對于衛星數管軟件,從功能上分析,大多圍繞遙測、遙控開展,這些功能包括大量協議格式操作和數據轉換操作,對應于軟件實現過程存在大量的8 bit和16 bit操作,另外,其底層硬件接口,包括串口和1553B總線等,也均為8 bit或16 bit端口,因此,程序在實現過程中,大多數函數均需要定義8 bit或16 bit局部變量進行數據交互操作。綜上所述,本文方法非常適用于此類軟件。如果軟件中絕大多數變量定義是32 bit或64 bit的,則需要在函數中顯示增加哨兵,即定義一個8 bit或16 bit局部變量并進行初始化,用于提高程序在雷區或隔離區觸發陷阱的概率。

圖5給出了一個使用本文方法的線程堆棧生長實例。

注:N為初始雷區的個數;M為堆棧生長經過雷區的個數。圖5 一個堆棧生長實例Fig.5 An instance for growth of stack

2.2 堆棧初始化

在線程創建時,一般需要指定其分配堆棧空間的大小,系統為線程分配堆棧后,軟件記錄堆棧的起始地址和分配深度。本文方法中,對于線程分配的堆棧要求其大小為1 Kbyte的整數倍,便于后續劃分和處理,也可以按照其他單位長度進行分配,本文以1 Kbyte為示例進行說明。

將分配的堆棧空間進行劃分,具體分為以下3個部分,見圖5左半部分。

(1)使用區:初始大小為2 Kbyte,起始地址。該區域為軟件正常運行時允許使用的堆棧區域。使用區域的頂部為當前棧頂,軟件需要單獨記錄堆棧當前棧頂,由于使用區初始設置為2 Kbyte,因此初始記錄的當前棧頂為起始地址減0x800;

(2)隔離區:位于堆棧分配空間的最后1 Kbyte,隔離區的起始地址等于堆棧區的起始地址減分配深度,再加0x400;

(3)雷區:位于使用區和隔離區之間,每個雷區占用1 Kbyte的空間。

正常情況下,軟件在對堆棧空間進行初始化時,將其全部初始化為0。本文方法中,同樣將雷區和隔離區中的數據均初始化為0,32 bit數據0對應的7 bit EDAC校驗為0xC,利用處理器的造錯機制,將實際寫入存儲器的校驗修改為0x0,使其存在雙比特錯誤。軟件通過操作BM3803的存儲器容錯配置寄存器1,2,3,可以對指定地址32 bit數據位和7 bit校驗位進行造錯。通過軟件設置存儲器容錯配置寄存器1的EWB位使能寫旁路,并設置存儲器容錯配置寄存器2為0x0(即數據位不翻轉)、存儲器容錯配置寄存器3為0xC(即校驗的第2位和第3位進行翻轉),然后對雷區和隔離區進行清0操作,實際寫入的32 bit數據為0x0,實際寫入的校驗為0x0,即7 bit校驗按照設置,其中第2位和第3位發生了翻轉。

軟件對堆棧進行初始化時,將堆棧中使用區初始空間進行清0。使用上述方法,將雷區和隔離區的空間全部清0,使雷區和隔離區中的所有32 bit數據0存在雙比特錯誤。

2.3 陷阱處理

在初始化堆棧完成后,線程進入正常運行狀態,隨著軟件調用函數等操作,堆棧逐漸生長,其使用范圍向低地址擴展,當使用范圍超過使用區(初始2 Kbyte)后,進入雷區。由于雷區內雙比特錯誤的存在,程序運行對堆棧使用時的操作類型受到了極大的限制,不可隨意進行讀寫操作,如果程序對雷區任意地址進行字節或半字寫操作,該操作會立即引發處理器異常,產生0x2B陷阱。

軟件進入陷阱處理程序后,通過讀取失效地址寄存器獲取發生陷阱的錯誤地址。通過地址范圍比對確認錯誤地址所在的范圍。①將該地址和各個線程的堆棧地址范圍進行比較,確定錯誤地址是否在線程堆棧區域中。②如果錯誤地址屬于某線程堆棧范圍,則將錯誤地址與軟件記錄的當前棧頂進行比較。若錯誤地址小于當前棧頂,且大于隔離區首地址,則確定錯誤發生在雷區;錯誤地址小于隔離區首地址,則確定錯誤發生在隔離區。否則,錯誤發生在堆棧正常工作區域,屬于其他問題引起的錯誤,不在本文的討論范圍內。

對于發生在雷區的錯誤進行以下操作:①關閉EDAC校驗功能;②將當前棧頂減0x400,即釋放一個雷區,使當前棧頂向上生長;③按照4 byte地址對齊,依次讀取該雷區中的所有數據,每讀取一個32 bit數據,將其寫回原地址(由于回寫過程沒有啟用造錯機制,因此實際寫入的32 bit數據為存儲器中原來實際存儲的數據,實際寫入的7 bit校驗為32 bit數據對應的校驗,即雷區內的雙比特錯誤全部被清除)。④若當前棧頂小于錯誤地址,則表示當前堆棧使用區已經覆蓋程序被訪問空間,則使能EDAC校驗功能,退出陷阱處理。否則,跳轉至②繼續執行。

對于發生在隔離區的錯誤,軟件可以根據需要自行制定故障恢復策略,如線程復位、等待狗咬復位或切換至備份設備等。

2.4 堆棧使用深度

對于堆棧的當前使用深度,在軟件實時運行過程中,可以通過訪問各個線程的當前棧頂,計算得出各個線程堆棧的使用深度(使用區的起始地址減去使用區的當前棧頂,精確到1 Kbyte),堆棧占用率為使用深度除以分配深度,再乘以100%。

3 實例驗證及結果分析

本文方法經軟件代碼實現后,對其運行性能和精度在目標硬件平臺上進行測試驗證。目標系統處理器采用BM3803平臺,主頻設置為30 MHz,分別對初始化模塊和陷阱處理模塊進行性能測試,測試結果如表1所示。從性能測試結果可以看出,與堆棧清0操作的初始化模塊相比,本文方法中的初始化模塊時延幾乎沒有增加。另外,由于軟件啟動后所有堆棧僅初始化1次,因此該延時幾乎可以忽略不計。多數情況下,陷阱處理模塊每次都只需要清掃1個雷區便可以退出,每個雷區至多進行一次清掃,因此558 μs的處理時間對系統性能基本沒有影響。

表1 模塊性能測試結果

以某綜合電子系統星載軟件為被測對象,利用本文方法對其創建的8個線程的堆棧使用情況進行測試,并與采用動態測試工具的測試結果進行比對,測試結果如表2所示。

表2 堆棧使用深度測試結果

本文選取上述測試用例中堆棧使用深度最大的線程進行堆棧溢出測試,測試前將該線程堆棧分配從32 Kbyte縮小為9 Kbyte。測試程序陷阱處理對堆棧溢出的線程進行掛起操作,并通過串口打印產生陷阱的地址、程序指針和線程ID。運行測試程序后,打印串口輸出如圖6所示。查看程序指針(操作雷區)地址0x4001BD54對應的函數為Insert_Pk_To_Vchannel,操作雷區的匯編指令為對一個字節地址清0。觸發陷阱的雷區地址為0x403E9422,位于編號為1的線程分配的堆棧區最后1 Kbyte內,即該地址處于隔離區,因此觸發陷阱,線程被掛起。

圖6 測試結果輸出Fig.6 Output of test result

上述測試結果表明:采用本文方法可以獲得堆棧的使用深度,其精確度為1 Kbyte,比動態測試工具測量數據的精確度差,但就堆棧余量觀察而言,該精度已經可以滿足使用要求。另外,本文方法和大多數動態測試方法相同,如果無法提供使軟件達到最大堆棧使用深度的測試用例,便無法測量堆棧最大使用深度。不同的是,本文方法可以在線實時獲取堆棧使用深度,并且溢出前可以提供溢出故障現場的關鍵信息(包括溢出地址、線程ID和溢出時的程序指針等),這些故障現場信息對后續的故障排查工作至關重要。

4 結束語

星載軟件在其運行過程中難以感知堆棧的生長過程,不能確定其使用余量是否充足,也難以對堆棧溢出故障進行定位。本文提出了一種應用EDAC容錯技術的堆棧溢出實時檢測方法,并以采用BM3803處理器的星載軟件為例,通過在堆棧中設置多個雷區,使軟件具備感知堆棧動態生長并實時計算堆棧占用率的能力,在堆棧棧頂設置隔離區,使軟件具備提前獲知堆棧溢出的能力。本文方法的優點在于:軟件可以實時獲取當前堆棧使用深度(精度精確到1 Kbyte);原理簡單,容易實現,實現后軟件可以在線、實時進行檢測。與文獻[3]中的方法相比,本文方法無需通過在軌上注測試程序,無需長期在軌周期性運行,因此對星上軟件運行與在軌維護影響更少。而且,采用本文方法時,軟件在堆棧溢出時會立即由陷阱處理程序接管,從而消除堆棧崩潰后軟件行為的不確定性,極大簡化系統故障處理應對措施的設計,提升軟件的可靠性。

主站蜘蛛池模板: 性喷潮久久久久久久久| 国产日韩欧美一区二区三区在线| 天堂成人av| 久久网欧美| 亚国产欧美在线人成| 国产主播一区二区三区| 亚洲精品卡2卡3卡4卡5卡区| 国产一区二区福利| 欧美成一级| 亚洲三级成人| 精品国产乱码久久久久久一区二区| 亚洲综合狠狠| 久久男人视频| 一级毛片在线直接观看| 亚洲欧美自拍视频| 国产JIZzJIzz视频全部免费| 国产成人AV大片大片在线播放 | 亚洲精品午夜无码电影网| 欧洲在线免费视频| 伊人久久大香线蕉影院| 日韩精品亚洲一区中文字幕| 日韩黄色在线| 98超碰在线观看| 91精品啪在线观看国产91| 无码在线激情片| 91久久天天躁狠狠躁夜夜| 四虎永久免费在线| 992tv国产人成在线观看| 又黄又爽视频好爽视频| 久久久久人妻一区精品色奶水| 朝桐光一区二区| 99视频只有精品| 日韩欧美中文字幕在线精品| 国产精品丝袜视频| 伊人欧美在线| 一本色道久久88| 精品在线免费播放| 亚洲国产精品无码AV| 亚洲成AV人手机在线观看网站| 试看120秒男女啪啪免费| 最新日本中文字幕| 国产一级小视频| 一区二区三区成人| 久久婷婷六月| 中国成人在线视频| 成人国产小视频| 国产综合网站| 欧美a级完整在线观看| a级毛片免费看| 在线观看国产精品日本不卡网| 激情乱人伦| 亚洲欧美自拍视频| 91国内视频在线观看| 久久亚洲AⅤ无码精品午夜麻豆| 99视频精品在线观看| 国产不卡在线看| AV片亚洲国产男人的天堂| 欧美日韩在线成人| 国产激情在线视频| 成人年鲁鲁在线观看视频| 精品国产一区91在线| 青草视频网站在线观看| 国产精品亚洲一区二区三区z| 综合成人国产| 欧美www在线观看| 亚洲综合专区| 萌白酱国产一区二区| 伊人激情综合网| 91成人在线免费观看| 波多野结衣中文字幕一区| 国产精品永久在线| 在线观看免费国产| 欧美在线伊人| 99热精品久久| 亚洲人成网站日本片| 国产高潮流白浆视频| 四虎国产永久在线观看| 夜夜高潮夜夜爽国产伦精品| 人与鲁专区| 精品无码日韩国产不卡av| 国产免费观看av大片的网站| 亚洲天堂视频在线播放|