虛擬化技術
和虛擬化技術最相關的就以 CPU 莫屬,不過在 x86 的 CPU 也不是一開始就支援虛擬化了,他是經過好幾代的改變,才由 CPU 去支援虛擬化的工作,目前常見的模式可以區分成下面幾種.
其中最為人知的虛擬化軟體非屬 VMware ,而在 1999 的 2 月,VMware 推出他們第一款 x86 虛擬化的產品 "VMware Virtual Platform",不過在一開始 VMware 是透過純軟體的方式去模擬出一個最簡易的硬體環境.再讓 Guest OS 運作在虛擬的硬體上面.所以算是 full Virtualization 的虛擬化的方式,主要是透過 Binary translation 的方式去解決虛擬和真實的硬體彼此溝通的橋樑.不過也因為如此在效能上比起一些以 natively virtualizable architecture (如 IBM System/370 or Motorola MC68020) 較差.
所以另外一項技術 Xen 在最近幾年快速竄起,他提供了比 full virtualization 較優的效能.因為他不是採用以虛擬出一個全新的硬體給 Guest OS,它採用的方式為 paravirtualization,但前提是 Guest OS 的核心都需要修改這樣 Guest OS 就可以直接和硬體層溝通,所以除了大部分的 Linux 和 FreeBSD 可以做修改外.Windows 的系統是無法使用這項技術,因為 Windows 不願意去修改他們的核心也不願意給別人修改.但是這一項技術在 CPU 的硬體支援下終於不用再透過修改核心的方式去配合 paravirtualization 的運作方式而改由 CPU 去支援.這就是 Hardware-assisted virtualization (Intel VT 和 AMD-V) ,這一項技術在 Xen 3.0 得到支援,不過這種以 CPU 為支援的方式在 Xen 下面也是被稱為 full virtualization.
除了 Open-source 和 VMware 外 Microsoft 也和 Connectix 技術合作也推出自家的虛擬化軟體 Hyper-V,其中使用 Hyper-V 的產品包括了Microsoft Virtual PC 和 Microsoft Virtual Server.
CPU
如果要應用 XEN full virtualization(Hardware-assisted virtualization) 這個新技術,那你必備的 CPU 就要有支援,在 Intel 叫做 VT(Virtualization Technology) 或者 AMD 的 V Pacifica.可以在購買前就詢問這系統和 CPU 是否支援虛擬化技術.不過 Hardware-assisted virtualization 在不同的平台上有著不同的名稱,比如你在 Xen 這種技術被稱為 hardware virtual machine (HVM), Virtual Iron 稱他為 native virtualization.
AMD virtualization (AMD-V)
AMD 包含虛擬化的 CPU 在一開始的名稱為 Pacifica 應該也是為 Project code name.但是現在都被稱為 AMD Virtualization 就簡稱為 AMD-V.
至於哪一些 AMD CPU 是包含 AMD-V 的技術,大概Athlon 64 和 Athlon 64 X2 這一系列 "F" 和 "G" stepping 的處理器以及Turion 64 X2, Opteron 2nd generation[1] and 3rd-generation[2], Phenom 和 Phenom II processors 皆支援 AMD-V.但是像是低階的 Sempron 處理器除了 Sable 和 Huron 都不支援 AMD-V.
不過最好的方式還是可以上 AMD 的官方網站來查詢 http://www.amdtaiwan.com.tw/us-en/Processors/ProductInformation/0,,30_118,00.shtml
除了查表外,還可以透過 Linux 直接查詢 CPU 的 Flag.方法如下
[root@benjr ~]# cat /proc/cpuinfo | grep svm
如果你有看到這個 svm(Secure Virtual Machine) Flag 那就代表這個 AMD CPU 有支援虛擬化 ,除了 CPU 要有支援你的 BIOS 也要有支援才可以.通常在 BIOS 的 CPU 設定中會有一樣是關於 virtualization的選項.也不是說沒有 AMD-V Pacifica 就不行玩 XEN 的虛擬化只是你能用的只剩下Full-Virtualization 或是 Para-Virtualization.就無法使用 Full-virtualization(Hardware-assisted virtualization).
Intel Virtualization Technology for x86 (Intel VT-x)
目前 Intel 推出含有 VT 的技術包括了下面幾項.VT-x 這是屬於 IA-32 和 Intel 64 架構的.VT-i 這是屬於 Itanium 架構的,包含 Intel VT 技術的 CPU 為下列所示.
- Core Duo T2300, T2400, T2500, T2600, T2700 (Yonah)
- Core 2 Duo E6300, E6400, E6320, E6420, E6540, E6550, E6600, E6700, E6750, E6850 (Conroe)
- Core 2 Duo E8200, E8300, E8400, E8500, E8600 (Wolfdale)
- Mobile Core 2 Duo T5500, T5600, T7100, T7200, T7250, T7300, T7400, T7500, T7600, T7600G, T7700, T7800 (Merom)
- Mobile Core 2 Duo P7370, P8400, P8600, P8700, P8800, P9500, P9600, P9700, T8100, T8300, T9300, T9400, T9500, T9600, T9800, T9900 (Penryn)
- Core 2 Quad Q6600, Q6700 (Kentsfield)
- Core 2 Quad Q9300, Q9400, Q9400S, Q9450, Q9550, Q9550S, Q9650 (Yorkfield)
- Core 2 Extreme X6800 (Conroe_XE)
- Core 2 Extreme QX6700, QX6800, QX6850 (Kentsfield_XE)
- Core 2 Extreme QX9650, QX9770, QX9775 (Yorkfield_XE)
- Xeon 3000, 5000, 7000 series
- Atom Z520, Z530, Z540, Z550, Z515 (Silverthorne)
- all Intel Core i7 processors
- Pentium Dual-Core E6300 and some version of the E5300 and E5400*
- Celeron E3000 series
不過最快的方式還是直接上 Intel 的官方網頁來查詢.
http://processorfinder.intel.com/Default.aspx
除了查表外,還可以透過 Linux 下來看 CPU 的 Flag.方法如下:
# Intel VT 的 flag 是 vmx
[root@benjr ~]# cat /proc/cpuinfo | grep vmx
同 AMD-V 如果你有看到這個 Flag 那就代表這個 Intel CPU 有支援虛擬化.
目前 Intel 推出含有 VT 的技術包括了下面幾項.
- VT-x 這是屬於 IA-32 和 Intel 64 架構的
- VT-i 這是屬於 Itanium 架構的
- VT-d refers to Intel VT for Directed I/O
目前 Intel 推出的 CPU 並未包過下面這項,這是未來 Intel 將計畫推出的.
- VT-c refers to Intel VT for Connectivity
Ring
是什麼技術可以讓 full virtualization(Hardware-assisted virtualization) 直接透過 CPU 的支援而可以使用未修改核心的作業系統.首先要先介紹一個東西 "Ring", 在 Intel x86 的 CPU 系統運行下可以區分成 Ring 0,Ring 1,Ring 2 和 Ring 3. Ring 0 擁有最高的權限,通常是由系統核心才會有 Ring0 的權限,Ring 0 可以直接和硬體溝通讀取 IO devices, CPU, Memory,其次是 Ring 1,以此類推.一般 Kernel,driver 會存在 Ring 0.一般 AP 存在 Ring 3,採取這種方式的優點是一般運行的程式沒有辦法直接與硬體溝通,所以不會有像 Window 3 時一樣的狀況發生,一個程式就能把整個系統 Crash 掉.
不過大部分的作業系統並沒有將用完這4個不同的等級,通常僅使用了2個等級,以 Linux 和 Windows 的系統來做說明,簡單分成兩種模式 supervisor / user-mode,其中系統的 Kernel 是運行在 supervisor mode(Ring 0).而 applications 則是運行在 User mode(Ring 3).
如果 user mode 的 Application 需要存取硬體支援時只能使用 supervisor(Kernel) mode.所提供的 system call 去存取.至於 Ring 1 和 Ring 2 在Linux 和 Windows 的系統是沒有特別定義.下面就是一般傳統 OS 的模式.
VMM(Virtual Machine Monitor)
一個機台要能同時執行很多作業系統時不能像是傳統的方式,所以需要有一個東西來管理所有虛擬化的作業系統(Guest OS).也就是所謂的 VMM(Virtual Machine Monitor).但也無法再像傳統的方式將 OS 的核心存放在 Ring0.所以解決方法為 Ring Deprivileging(特權等級下降),Ring 0 ;取而代之的就是 VMM(Virtual Machine Monitor) 也可以稱作 Hybervisor.此時VMM 為虛擬化的資源分配管理者,他主要工作為.
- 模擬出一個完整的硬體環境給每一個 Guest OS
- 分配硬體支援給每一個 Guest OS
- 每一個 Guest OS 都是獨立出來不會被彼此影響的
上面所敘說的方式為 VMM 運行在 Privilege 0 ,Guest OS 運行在 Privilege 1(0/1/3模型)
但是這樣的缺點是會造成效率的低落,如剛剛前面所說的除了 Ring 0 可以直接和硬體溝通讀取 IO devices, CPU, Memory 那在 Ring 1 的 Guest OS 需要透過所謂的 Binary translation( Full Virtualization) 就是將原本要執行不能虛擬化的指令(nonvirtualizable instructions)VMM 會轉換成另一種語法,然後再交由 VMM 去執行.VMM 會把他的請求轉換成另一種方式再來向硬體提出要求.而不再是用原本的指令去執行了.因為需要轉換所以效率能會比較低.
在一開始沒有 VT 的時代 Xen 的 VMM(virtual machine monitor) 也被稱為 Hybervisor 是直接載入在 Ring 0 裡面,Dom0 的 kernel 則是被放在 Ring 1 (Dom0 是第一個在 Xen 底下運行的虛擬機器).後來產生出的 DomU 也是存放在 Ring 1 (需為 Para-Virtualized).不過一般的 AP 還是運行在 Ring 3.Xen 的 Paravirtualization 是透過修改虛擬化作業系統(Guest OS)的核心,讓虛擬的作業系統(Guest OS)可以直接將不能虛擬化的指令(nonvirtualizable instructions)自動轉換成 VMM 可以執行的指令(hypercall),再由 VMM 去向硬體提出請求.雖然 Xen 的 Paravirtualization 的效能可以提昇但是採用這種架構的缺點是只有支援 Paravirtualization 的作業系統(Guest OS)才能使用.
另外一種方式為 Host OS 運行在 Privilege 0,VMM 運行在 Privilege 3,Guest OS 運行在 Privilege 3(0/3/3模型),這基本上是將虛擬化當作應用程式來使用,而這一種方式會吃掉系統很多資源所以通常只會使用在 Desktop 上面.
VMX & SVM
VMX 和 SVM 是 Intel VMX(Virtual Machine Extensions) 以及 AMD svm(Secure Virtual Machine) 的簡稱.這兩項都是 CPU 虛擬化的技術.Intel 為了解決 Guest OS 的核心無法處在 Ring 0 所以將 CPU 的操作畫分成兩種不同等級的 forms(類型)一是 VMX root operation(根虛擬化操作),也有人會將這一層解釋成 Ring -1(負一) 不過在實際上的名稱還是稱為 VMX root operation.這邊就是提供給 VMM(Virtual Machine Monitor) 也可以稱作 Hybervisor 來使用,二是 VMX non-root operation(非根虛擬化操作) 這邊就可以提供給 Guest OS 來使用,並以傳統的方式將 Ring 劃分為 4 個等級(Privileges levels).此時 Guest OS 的核心就可以在 Ring 0 下操作,也不會有效能上的損益( overhead )的問題了.
8 thoughts on “Virtualization- CPU”