我從未看過AMC的影集《Halt and Catch Fire》,很長一段時間我只知道這個標題,卻對劇情一無所知。這個詞總讓我聯想到程式設計師的幽默:有點戲劇化、有點荒謬,卻又奇妙地精確。事實上,這部影集確實是關於1980和1990年代的電腦產業,但這個詞本身比影集還要早得多,起初是工程師間的幽默用語。
在電腦領域中,「Halt and Catch Fire」(簡稱HCF)被廣義用來描述會讓CPU停止執行任何有用工作的機器碼,必須透過重置(或斷電重啟)才能恢復。從字面上來說,它會「停止」機器。當然,「catch fire」部分是個玩笑,但其實並非完全不可能。以IBM System/360為例,當系統遇到某個無效的操作碼時,會不斷存取磁性核心記憶體中特定位置,導致過熱甚至起火。
隨著時間推移,HCF也成為未記錄或無效操作碼導致處理器鎖死的統稱,包括看似掛起的測試模式,以及真實的硬體錯誤(你可能還記得早期Pentium晶片中,利用特定非法指令造成鎖死的F00F漏洞)。
這個詞的誕生部分源自三字母組合語言助記符的標準用法:ADD、CMP、JMP等。這個笑話在多種出版物中流傳,其中就包括HCF和我個人喜愛的其他助記符。
所以HCF最初只是個笑話,直到它不再只是笑話。
Motorola 6800擁有256個單字節操作碼,但並非每個位元組合都對應到官方文件中的指令。若碰到錯誤的操作碼,晶片會執行矽晶體「解碼」出的行為——有時沒什麼反應,有時則有重大影響。
Gerry Wheeler在1977年12月的BYTE雜誌(第2卷第12期,技術論壇第46-47頁)發表了《Undocumented M6800 Instructions》一文。他從Motorola官方文件出發:197個有文件記載的操作碼,剩下59個位元組合在官方說法中沒有解釋。其中一些像NOP(無操作指令),有些會改變條件碼暫存器,Wheeler當時稱這些行為仍是「未解碼」的,而兩個位元組$9D和$DD則有一個特別惡劣的結果,他稱之為Halt and Catch Fire。他明確表示「助記符當然是我自己指定的」。
硬體層面實際發生的是,晶片停止像正常的取指-解碼-執行引擎運作:程式計數器持續遞增,晶片持續發出讀取信號,地址線像硬體計數器一樣快速遍歷記憶體。中斷無法阻止這種自我毀滅的過程,唯一能跳出迴圈的方法是重置或斷電重啟。Wheeler的描述值得直接閱讀原文,而非簡述:
「執行這條指令時,唯一能看出它在做什麼的工具是示波器。從使用者角度看,機器停止運作,且大多數嘗試重啟的努力都失敗。若有地址匯流排指示燈,會看到處理器開始非常快速地依序讀取整個記憶體。實際上,地址匯流排變成一個16位元計數器。然而,處理器不理會讀取的內容……它只是讀取。」
關於「catch fire」部分,他補充說:「嗯,幾乎如此。」雖然IBM系統在某些情況下確實會起火,但Motorola 6800並沒有。
在BYTE之外,這組操作碼還有其他綽號。David J. Agans在《Debugging》(2002)中回憶,DD被他們團隊稱為「Drop Dead」指令——同樣是匯流排掃描技巧,只是名字不同,且工程師會故意使用它,因為「所有地址和時鐘線在示波器上呈現漂亮的方波循環」。
大多數機器只是看起來像掛起。在至少一台早期6800微電腦中,因記憶體映射視訊不穩定,這種模式會顯示為可見的「雪花」畫面。Ben Z在Sphere News的文章是個很棒的深入探討(涵蓋視訊RAM仲裁、時序、CRT顯示異常)。
多年後,Motorola工程師在IEEE Design & Test(1985)中撰文,描述客戶在MC6800上發現的非法操作碼,內部暱稱為HACOF,程式計數器會無限遞增直到重置。他們還提到一個幾乎難以置信的細節:產品工程團隊想要一種快速掃描RAM的方式,在開發階段發現這種行為已經能做到,於是決定保留它,而不是花錢去移除。用Bob Ross的話說,這是個「美好的意外」。
最近,有人實際在硬體上測試MC6800,並非只依賴舊雜誌和維基百科的資料。Doc TB的實驗室報告指出一個有趣細節:在操作碼取出後,地址線進入著名的快速計數模式前,有數十毫秒的延遲,且還有其他未記錄的操作碼,看起來是這個行為的較慢或不穩版本。
Motorola並非唯一有此問題的現代處理器:非法6502操作碼會鎖死CPU,Pentium的F00F漏洞(如果你記得那個時代),某些架構中成對指令會無限等待永遠不會到來的中斷,以及現代x86模糊測試中仍不斷發現無效狀態。
基本上,透過模糊測試,他們嘗試給處理器隨機或意外的資料,以協助找出處理器的漏洞或錯誤。這策略相當有效,不僅對處理器,對各種軟體也同樣適用。
這次研究歷史非常有趣——關於「catch fire」部分,發現的內容比預期還多。隨著軟體層級不斷提升,我們很容易從一萬英尺高空視角忽略硬體層面。歸根究柢,它不過是一堆矽晶體以特定方式連接,有時會出錯。
我只知道這個詞太棒了,不能不使用——未來某個專案(或公司)很可能會用上「HCF」這個縮寫。