虛擬化與容器

二進位轉譯(binary translation)

二進位轉譯(binary translation)是讓人們得以虛擬化老舊 x86 的巧妙把戲,即使它的硬體並不配合捕捉並模擬。回想那個問題:少數敏感的 x86 指令在非特權下不陷入,而是默默做錯事,所以超管理器根本沒機會介入。解法是「不要信任那些指令會乖乖聽話」——而是在客體機器碼即將執行之前掃描它,把危險的指令改寫成會呼叫超管理器的安全指令。這就像一位仔細的校稿員,在演員上場演出每一頁劇本之前先讀過,悄悄把任何會引發真爆炸的台詞,換成假爆炸的版本。

具體來說,超管理器是動態地、且只在需要之處這麼做。客體一般的使用者模式程式碼不動,直接全速執行。但客體的核心程式碼則在即將執行前一塊一塊地檢視:無害的指令原封不動地複製通過,而每一道有問題的指令會被轉譯成等效的序列,使其陷入或跳進超管理器,讓正確的虛擬行為發生。轉譯後的程式碼區塊會被快取,所以一個熱迴圈只轉譯一次便重複使用。這個做法完全不需要修改客體作業系統,這正是它被稱為全虛擬化(full virtualization)的原因——一套未經修改的作業系統照原樣執行。

二進位轉譯是讓 x86 虛擬化在商業上成真的技術(VMware 開創了它),比 CPU 加上硬體協助早了好幾年。它誠實的代價是轉譯本身的工夫,以及它所增加的間接,尤其對核心密集或輸入輸出密集的工作負載而言。等到 Intel VT-x 與 AMD-V 出現,硬體輔助虛擬化讓超管理器改去倚賴 CPU,二進位轉譯便淡出快速路徑——但它仍是一項里程碑式的技術,在缺乏硬體支援的場合至今仍在使用。

當一個客體核心即將執行一段含有「會默默出錯的敏感指令」的程式碼區塊時,超管理器把那一道指令改寫成對自己的呼叫,區塊其餘部分原封不動,把結果快取起來,再執行這個修補過的區塊。下次同一段程式碼再跑時,就直接重用快取的轉譯,不必重新掃描。

超管理器即時改寫危險的客體指令,再把結果快取起來。

二進位轉譯帶來全虛擬化(客體作業系統不必修改),這與半虛擬化形成對比——後者刻意修改客體使其配合。兩者都是對同一個 x86 問題的解答;後來硬體輔助虛擬化讓兩者在 CPU 工作上都變得不那麼必要。

又称
full virtualization via binary translation全虛擬化