歡迎關注個人公衆號睿Talk
,獲取我最新的文章:segmentfault
服務器虛擬化技術是雲計算的基石,在最大化利用硬件資源的同時,又下降了使用成本,讓系統具有彈性伸縮能力,促使現代系統的架構出現了革命性的變化。不管是微服務架構仍是服務網格架構,都是在服務器虛擬化技術日漸成熟後才得以大規模使用。本文主要介紹 CPU 虛擬化技術的演進過程,以英特爾的 x86 平臺爲主,爲掌握雲計算相關知識打好基礎。安全
爲了提高系統的安全性,避免惡意操做,CPU 廠商設計了一種分級保護的機制。以 x86 芯片爲例,就分爲 Ring 0 到 Ring 3 幾個級別。服務器
Ring 0 擁有最高特權,能夠和硬件直接交互,操做系統就是跑在 Ring 0。而應用軟件通常跑在 Ring 3 上,當須要調用特權指令(如寫內存)的時候,就會觸發一個軟中斷,操做系統捕獲到後再去作相應的操做,操做完再將控制權交還給應用。多線程
保護環暫且聊到這裏,下面還會講這種設計存在的一些問題,請繼續往下看。架構
服務器虛擬化最先在 19 世紀 60 年代就提出了,當時的機器都是單線程的,一臺機只能跑一個程序,很浪費硬件資源。因而就有人研究在一臺物理機上跑多個操做系統,這樣就能跑多個程序了。但後來因爲操做系統的改進,出現了多進程和多線程技術,因而虛擬化技術就被暫時擱置了。微服務
到了 1998 年,隨着二進制翻譯技術的成熟,在一臺機器上跑不一樣的操做系統已經不成問題。二進制翻譯技術簡稱BT,是一種直接翻譯可執行二進制程序的技術,可以把一種處理器上的二進制程序翻譯到另一種處理器上執行。二進制翻譯技術將機器代碼從源機器平臺映射(翻譯)至目標機器平臺,包括指令語義與硬件資源的映射,使源機器平臺上的代碼「適應」目標平臺。最先做出嘗試的是VMware
,實現原理見下圖:雲計算
操做系統和 VMM (Virtual Machine Monitor)跑在 Ring 0 上,虛擬化的 OS 跑在 Ring 1 上。當虛擬化 OS 須要跑內核指令的時候,就會觸發軟中斷,VMM 捕獲後就會進行必要的翻譯和執行操做。但x86架構有一類特殊的指令,稱爲敏感指令,它既能執行特權操做,又沒法被 Ring 0 捕獲,致使虛擬機沒法正確的執行這些指令。
爲了解決這個問題,先後發展出 3 種方案:spa
二進制翻譯原理就是 VMM 動態的掃描虛擬操做系統的內核,一旦發現不能被捕獲的敏感指令,就將其替換爲一條或多條的特權指令,這樣就能保證指令的正確執行。典型的表明是VMware
的第一代虛擬桌面。這種技術有一個致命的弱點,就是能明顯的感受到虛擬機會卡頓,由於動態掃描和替換指令是一種很耗資源的操做。操作系統
超虛擬化技術就能很好的解決二進制翻譯的問題。它的原理是提早修改安裝在虛擬機上的操做系統,將敏感指令替換掉,這樣全部的特權指令都能被 VMM 捕捉到了,典型的表明是第一代的Xen
。但這又帶來另外一個問題,就是安裝的操做系統必須是內核被修改過的系統,不能隨意安裝任意的系統。線程
英特爾慢慢意識到本身芯片存在的問題,因而改良了芯片設計,在 CPU 保護環中新增了 Ring -1 層。VMM 跑在 Ring -1 層後,全部的指令都能被捕捉了,並且還新增了一些專門用於虛擬化的指令,這就是 VT-X 技術。最先使用這一技術的KVM
公司,在成功商業化後就被英特爾收購了。隨後英特爾宣告將KVM
技術開源,造福整個產業。
CPU 的虛擬化是服務器虛擬化的關鍵技術,但如內存和網卡等其它硬件的虛擬化技術也不容忽視,在這方面QEME
公司就作得很好。因而KVM
和QEMU
的組合就奠基了服務器虛擬化的基石。
虛擬化層,也就是上文提到的 VMM,如今通常會命名爲 Hypervisor。Hypervisor 有 2 種類型:
Type 1 的 Hypervisor 不依賴操做系統,直接安裝在硬件之上,典型的表明是Xen
和KVM
。
Type 2 的 Hypervisor 安裝在特定的操做系統之上,像跑應用同樣的啓動和操做虛擬機,典型的表明是Oracle VirtualBox
和VMware Workstation
。
本文介紹了 CPU 虛擬化技術的演進過程,從二進制翻譯、超虛擬化再到終極的解決方案硬件輔助虛擬化。虛擬化技術的不斷演進,爲雲計算的工業化鋪平了道路。在後面的文章中,我還會繼續介紹雲計算的相關知識,敬請期待。