火星上人類第一個BUG是怎麼遠程解決的

創建於 2020年4月20日

1997年7月,NASA 的 Mars Pathfinder(火星探路者)在降落火星表面後出了這麼一檔子事兒,被稱爲“火星上人類的第一個BUG”。

當飛船開始採集氣象數據的時候,飛船所使用的 vxWorks 操作系統掛起(hung)並開始不斷地重啓。

究其原因,這是一個實時操作系統的經典BUG:Priority Inversion(優先級反轉)。

解決辦法聽上去很簡單,工程師上傳了一小段 C 語言程序給飛船,從而在運行時將優先級繼承的互斥標誌從 false 改爲 true,但請注意這是二三十年前,距離地球差不多6000萬公里。

(注:優先級繼承指的是,一旦發現低優先級任務佔用了高優先級任務的資源,便立刻將其優先級升爲與被佔用任務相同優先級,儘快執行完。)

 

那麼到底是如何修復遠在火星上的飛船軟件呢?

火星探路者軟件開發組組長 Glenn Reeves 說:

我們並沒有使用 vxWorks shell 來變更飛船上的軟件,雖然飛船上這個 shell 是可用的。飛船軟件打補丁一般來說是發送了一個(通過 Diff 處理得到的)差量文件給飛船,飛船經過一系列校驗之後修改軟件(onboard copy)。

昀哥理解他們是這麼做的,vxWorks 自帶一個C語言解釋器,它允許開發人員輸入和執行 C 語言表達式來進行系統調試。工程師們決定開啓這個特性,然後上傳一小段 C 程序,在它解釋並執行的時候就可以把優先級繼承的互斥標誌從 false 改爲 true。

圖 發現並修復了這個 BUG 的工程師 Glenn Reeves,他背後是火星探路者的複製品

Priority Inversion(優先級反轉)是嵌入式實時系統裏的一個經典的問題。

 

三個任務的優先級

有三個優先級不同的任務,A、B、C。A的優先級最高,B次之,C最低。其中A和C有共享的臨界區。如果C已進入臨界區,那麼A在進入臨界區之前,就會被阻塞。B有可能打斷C而進入運行狀態,這樣C什麼時候從臨界區退出,就是一個未知的時間。A只有在C從臨界區退出後才能被調度,A被阻塞的時間也是未知的。這樣,低優先級的B先於高優先級的A被調度,優先級發生了逆轉。

 

優先級反轉原理圖

 

這個問題在一般的操作系統裏並不是一個嚴重的問題,最多A被多阻塞了一段時間。但是,在實時系統裏面,如果一個任務在規定的時間裏面沒有被調度運行,系統就相當於失敗了,可能引發系統崩潰。

這個BUG實際上在地球上做飛行前預檢測試的時候已經發現了,但不幸的是,BUG等級被標註爲低優先級,於是帶傷上了火星……

我們從中得到的經驗教訓是:

只有對實際系統行爲(即使它在火星)能做端到端的詳細追蹤(現場調試和日誌下載),才能捕獲、識別並解決錯誤。一個不能追蹤和調試的黑盒子(即使它在你所在的城市),跟肉包子打狗沒有區別。你的設備自帶遠程調試(甚至是遠程鏡像工具,就像我們的IoT平臺太空橋所做到的一樣)是非常重要的。如果不能即時修改系統,則萬事皆休,尤其是在2020年,你還能隨隨便便去一個城市、進入保衛森嚴的園區或辦公樓嗎?

 

火星救援劇照

-END-

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章