[os]Intel VT-x硬體虛擬化(vmx和vmcs)(1)

Akiho發表於2024-03-30

Intel VT-x是Intel的虛硬體輔助擬化方案,TV的意思是Visualization Technology. 硬體輔助虛擬化方案是系統虛擬化技術的一種,重要是用來彌補虛擬化漏洞.

虛擬化漏洞

虛擬化系統必須滿足三個條件:

  • 資源控制:虛擬機器對於物理資源的訪問都應該在Hypervisor的監控下進行
  • 等價:上層應用與物理機執行沒有區別,特權指令可以自由執行
  • 高效:絕大多數客戶機指令可以由主機硬體直接執行

主要是資源控制,另外兩個都比較好理解. CPU架構中會觸發特權級切換的指令稱為特權指令,這些指令只能在最高特權級中執行,而操作敏感物理資源的指令稱為敏感指令,例如I/O指令和頁表基地址切換指令等. 資源控制要求訪問敏感物理資源的指令都需要在Hypervisor的監控下執行,Hypervisor執行在最高特權級,虛擬機器執行敏感指令必須trap進入Hypervisor執行. 這種處理方式要求所有的敏感指令都會觸發特權級切換. 然而由於早期x86架構對虛擬化支援不足,存在一系列敏感非特權指令. Intel將這些指令稱為“虛擬化漏洞”.

硬體輔助虛擬化技術就是解決虛擬化漏洞的軟體方案之一,籠統的講,就是在虛擬機器執行敏感指令的時候透過超呼叫主動陷入Hypervisor. Intel VT-x引入了VMX操作模式,包括根模式和非根模式,Hypervisor執行在根模式而虛擬機器執行在非根模式. 非根模式中所有的敏感指令都會觸發VM-Exit而陷入Hypervisor,讓所有敏感指令都會觸發異常.

VMX操作模式

支援VT-x的Intel CPU可以透過VMXON/VMXOFF指令開啟或關閉VMX操作模式. Hypervisor執行在VMX根模式,虛擬機器執行在非根模式. root和non-root都有Ring0-Ring3特權級,Hypervisor執行在root的Ring0特權級上. VMX下虛擬機器執行敏感指令時,從non-root切換到root,稱為VM-Exit;從root切換到non-root稱為VM-Entry. VMX中敏感非特權指令可以穩定觸發VM-Exit,從而陷入Hypervisor進行處理.

Hypervisor處理來自non-root的虛擬機器VM-Exit陷入的過程可以簡單描述為:

exit_handler () {
	get_exit_reason();
	call_handler();
	return_to_guest();
}

用自然語言描述就是:Hypervisor讀取VM-Exit相關資訊,判斷造成VM-Exit的原因(I/O指令觸發或是外部中斷)並進行處理(handle),處理完成後Hypervisor呼叫VMX指令VMLAUNCH或VMRESUME指令從root切換到non-root,恢復虛擬機器執行.

VMCS

熟悉作業系統就會發現上述過程有一個問題:特權級切換或者說陷入過程需要上下文切換. 確切的說,是虛擬機器的vCPU上下文切換. 陷入Hypervisor時需要儲存vCPU狀態,從Hypervisor返回需要載入vCPU的暫存器狀態. VMCS就是用來儲存虛擬機器和Hypervisor暫存器狀態的機制.

VMCS全程Virtual Machine Control Structure,虛擬機器控制結構,是記憶體中的一塊區域,用於在VM-Entry和VM-Exit的時候儲存和恢復虛擬機器和Hypervisor暫存器狀態. VMCS與vCPU一一對應,當vCPU被排程到物理CPU的時候,需要將對應的VMCS與物理CPU繫結,才能實現儲存和恢復暫存器狀態.

VMCS雖然存在記憶體當中,但是與架構強相關,部分內容可能存在cache當中,所以只能透過Intel VT-x提供的指令來進行讀寫:VMPTRLD將VMCS與CPU繫結,VMCLEAR將CPU中快取的資料寫入記憶體VMCS中,並將VMCS與CPU解綁,VMREAD和VMWRITE可以透過索引讀寫VMCS的資料域.

VMCS的大小不確定,上限為4KB,可以透過查詢MSR暫存器組中的IA32_VMX_BASIC[32:44]得到具體的大小. VMCS組成:

  • 4KB VMCS版本識別符號:指明VMCS資料域的格式
  • 4KB VMCS中止指示符:記錄VMX中止的原因
  • 不確定大小的VMCS資料域

VMCS資料域包含客戶機狀態域、宿主機狀態域、VMX控制域(控制guest os在non-root時哪些行為可以觸發VM-Exit)、VM-Exit控制域、VM-Entry控制域和VM-Exit資訊域(觸發VM-Exit的基本原因和其他資訊).

VMCS獨立於Hypervisor,在記憶體中存在,涉及硬體輔助虛擬化的方方面面,但是主要作用可以概括為:儲存和恢復暫存器以及儲存VMX控制資訊.

小結

第一篇只是對Intel VT-x的簡單認識,後面會讀Intel的手冊,主要看看VMX指令. 然後看一下 https://github.com/equation314/RVM-Tutorial 這個.

參考文獻

深入淺出系統虛擬化原理與實踐. 戚正偉, 管海兵. 清華大學出版社.

相關文章