跳轉到

1.1 1960年代虛擬機的起源(IBM CP/CMS 與系統虛擬化)#

歷史背景:分時需求的誕生#

虛擬機(Virtual Machine)的概念並非資訊時代晚期的產物,而是可以追溯到 1960 年代大型主機(mainframe)的黃金時期。當時一部 IBM System/360 或其後繼者價格動輒數百萬美元,任何一個大學或企業都不可能為每位研究者購置一部專屬電腦。於是「如何讓昂貴的硬體資源被多人共享」成為當時電腦科學的核心課題,分時系統(time-sharing)應運而生。MIT 的 CTSS(1961)與後來的 Multics(1964 年起)都是這股浪潮下的代表作。

然而分時作業系統的開發與除錯有著極大的困難:多位使用者同時共用同一個核心,任何一位使用者的錯誤程式都可能搞垮整個系統;作業系統研究者無法在一台機器上「重現」另一台機器的環境來除錯。這個痛點催生了一個革命性的想法:與其讓多位使用者直接共用一個作業系統,不如先用一層軟體把實體硬體「複製」成多份,每一份都看起來像一台完整、獨立的電腦,再讓每台虛擬電腦上各自執行一個完整的作業系統。這層軟體就是最早的 hypervisor(超級監督者),也稱為 Virtual Machine Monitor(VMM)。

IBM CP-40 與 CP/CMS#

實現上述想法的關鍵工作發生在 IBM 位於劍橋的科學中心(Cambridge Scientific Center)。1964 年前後,IBM 為了推廣尚未普及的 System/360,需要一個能在舊機型上模擬新機型的方案。Gerard "Gerry" Blaauw、Robert Creasy 等人參與了 CP-40 專案:CP-40 是第一個真正意義上的系統虛擬機監督器,它在特製的 IBM System/360 Model 40 上(硬體加了定址修改)實現了單一實體機器上同時執行多個虛擬機器的能力。每個虛擬機器上都可以執行一個完整的 CMS(Conversational Monitor System),讓使用者擁有互動式的個人作業環境。

這條技術路線後來演化為著名的 CP/CMS:

+----------------+----------------+----------------+
|    CMS #1      |    CMS #2      |    CMS #n      |   <- 客座作業系統
+----------------+----------------+----------------+
|                 CP (Control Program)             |   <- VMM / hypervisor
+--------------------------------------------------+
|                  實體硬體 S/360                   |
+--------------------------------------------------+

CP 負責把 CPU 時間、記憶體、磁碟等資源切割給各個虛擬機;CMS 則是輕量的互動式單人作業系統。CP/CMS 在 1967 年前後開始運作,IBM 隨後以 VM/370(1972)之名將其正式產品化,成為 IBM 大型主機上長銷四十年的產品線(後續的 VM/ESA、z/VM 皆為其後裔)。特別值得注意的是,VM/370 在虛擬記憶體剛被引進 System/370 之際,成功地把「分頁虛擬記憶體」這個新的硬體機制也虛擬化了——每個客座作業系統都以為自己擁有完整的分頁硬體。

為什麼 1960 年代的硬體「剛好適合」虛擬化#

虛擬機能在 System/360 上成功,並非偶然,而是因為該世代大型主機的指令集架構設計得「夠正交」:特權指令(privileged instructions)只在特權態(supervisor state)執行,且在用戶態執行這些指令時會觸發硬體陷阱(trap)。這個特性讓 VMM 可以用「trap-and-emulate」的方式攔截並模擬所有敏感操作。當時 IBM 甚至刻意在硬體中加入「虛擬化輔助」功能,因為虛擬機是公司的產品需求。諷刺的是,到了 1980 年代的 x86 微處理器時代,許多敏感指令並不會陷阱(詳見第 5 章),反而使 x86 在近三十年間無法被純軟體虛擬化,這也是 Popek 與 Goldberg 1974 年那篇經典論文所刻劃的理論邊界。

虛擬機概念對後世的深遠影響#

CP/CMS 之後,「模擬一台機器」的想法分裂出數個研究與工程脈絡:

  1. 系統虛擬化:VM/370 → VMware(1998)→ Xen(2003)→ KVM(2006),最終由硬體輔助虛擬化收束,成為今日雲端運算的基石。沒有 hypervisor,就沒有 AWS 這類以虛擬機為單位出租的基礎設施。
  2. 程序虛擬機:1970 年代的 Pascal P-code、1980 年代的 Smalltalk-80 VM、1995 年的 Java Virtual Machine,把虛擬機從「模擬整台電腦」轉向「為一種語言提供可攜的抽象執行環境」。
  3. 模擬器與考古:EM80、SimH 等模擬器讓已消失的硬體得以復活,也反過來證明了「機器只是一份規格,規格可以被軟體實作」這個虛擬機哲學。

小結#

1960 年代的 CP/CMS 確立了兩件影響至今的事:第一,硬體不必是「物理的」,一份精確的機器規格可以由軟體忠實地重新實作;第二,作業系統本身也可以被虛擬化,堆疊出「硬體之上跑 VMM、VMM 之上跑多個 OS」的分層結構。這個分層思想與編譯器領域的中間表示(IR)思想異曲同工:都是藉由定義一個穩定的抽象層,來解耦上下兩層的演化速度。理解虛擬機的歷史,就是理解現代計算機系統分層化的歷史。