天天看點

Intel Vt虛拟化筆記

  源碼 + 手冊 + 開發/應用。vt技術學習需要時間沉澱,去年學習保護模式對vt做了簡單的學習,時間久了知識還是忘記了。

  源碼使用ke_github開源代碼,Intel手冊19~31章,從0~1了解+編寫代碼,應用開發VT-EPT_API-Monitor。

  

學習方法:站在巨人的肩膀

  1. 19~31章節認真閱讀了解,子產品化片斷寫成代碼,順帶鍛煉英語閱讀能力。
  2. 主要是了解思路,自己先依據手冊寫代碼。以應用為導向,開發自己的vt api監控。

19章:

  1. IA-32擴充支援Virtual-machine monitors(VMM)/Guest software,VMM完全控制處理器和其他平台硬體,能夠保留處理器資源,實體記憶體,中斷管理和IO。來賓這裡初略了解成節點虛拟機
  2. VMX兩種,VMM運作在VMX root,Guest software運作在non-root,轉換至VMX non-root叫做VM條目,VMX non-root轉換到VMX叫做VMX exit.這個過程就像進門和出門兩個概念。

了解VMM生命周期

  1. 軟體進入VMX操作 用 VMXON指令
  2. 使用VM進入,利用VMLAUNCH VMRESUME進入Guest virtual machines,VM exit重新擷取控制
  3. VM傳輸控制退出到VMM指定入口點,根據退出原因處理,vm條目傳回虛拟機
  4. VMXOFF實作關閉離開虛拟機
Intel Vt虛拟化筆記

  VMX non-root 轉換 VMX是 virtual-machine control structure(VMCS)控制,VMSC指針來通路結構體(64bit),分别使用VMPTRST/VMPTRLD讀寫結構,VMREAD/VMWRITE/VMCLEAR指令配置,軟體進入VMX操作之前,必須支援VMX。

if(CPUID.1:ECX.VMX[bit 5] == 1)

{

  支援VMX

}           

  通過CR4.VMXE[bit 13] == 1開啟VMX,通過VMXON進入,如果VMXE==0會有觸發異常

VMXON由IA32_FEATRUE_CONTROL_MSR控制.

  VMX限制操作,不可以處在A20模式,INIT信号會被阻塞,VMX需要CR0.PE/CR0.NE/CR0.PG/CR4.VMXE标志位為1,保護模式/分頁模式才可以運作MVX操作,這說明來賓不可以在非分頁模式下。

  本章組要介紹了VMM/VMX/Guest概念,VMX生命周期指令,重要的是VMX支援條件。

20章

  VMX非根操作,VMCLEAR/CMPTRLD/VMREAD/VMWRITE,每個處理器将記憶體中的一個區域,與VMCS關聯,被稱為VMCS regIon.通過64-bit 位址來引用,這就是VMCS pointer。

  必須在4kb的邊界上對其指針(bit 11:0必須為0),VMPTRLD可以讓VMCS活躍,還有介紹了一些其它指令和VMCS關聯

Intel Vt虛拟化筆記

VMCS區域最多4kb,區域格式

Intel Vt虛拟化筆記

  VMCS前32Bit是revision identifier,不同的格式維護VMCS,使用VMCS之前需要填充VMCS revision identifier,如何與處理器标志版本不用,VMPTRLD則失敗。

  記下來的32-bit則是abort indicator,這些位不會幹擾處理器,如果發生了VMX中止,則執行這些位,這區域記錄中止相關資料。

  剩下區域是VMCS資料,用來控制non-root VMX disecover VMX等,特定格式實作,明天繼續。

VMCS

1) Guest-state area:

每個VM條目從這些字段加載處理器狀态,并且存儲在VM出口的字段中。

Register

控制寄存器 CR0,CR3,CR4 64-bit

調試寄存器 DR7 64-bit

RSP,RIP,RFLAGS 64-bit

CS,SS,DS,ES,FS,GS,LDTR,TR,關于段寄存器介紹

Non-Register

活動狀态(32bit):

Active 時候處理器正常執
1 HLT 執行HLT指令,處理器不活動
2 Shutdown 處理不活動,三重故障 嚴重錯誤
3 Wait-for-SIPI 處理不活躍,等待IPI重新開機

可中斷狀态(32bit)

0 STL中斷,STL設定的EFLAGS (IF-bit)RFLAGS.IF = 0

1 MOV SS 疑問:

2 SMI

3 NMI

31:4

等待異常調試(64-bit):

3:0 B3-B0 即使沒有DR7支援,每一個位都可以辨別

11:4 這個标志位保留,如果不是0 VM進入失敗

12 bit開啟斷點

13 保留

14 BS 單步觸發

63:15

VMCS link pointer(64bit) 設定成FFFFFFFF_FFFFFFFFH 避免進入VM失敗

2) Host-state area:

從VM exits加載狀态

CR0,CR3,CR4,RSP,RIP

Intel Vt虛拟化筆記

3) VM-execution control fields:

VM執行控制VMX non-root操作,決定了VM退出原因(一定程度)

建構32向量處理異步事件(比如中斷)

基于引腳的VM執行

VMX non-root

0: 擴充中斷退出,如果為1的話,VM外部中斷則退出,否則傳遞至IDT。如果為1, RFLAGS.IF不影響。

3:NMI擴充,如果為1的話,非掩碼中斷導緻VM退出

5:虛拟NML,如果為1意味着違背NMI阻塞。

基于處理器的VM執行
異常位圖
I/O位圖位址
時間戳偏移
Guest/Host CR0 CR4
CR3-Target Controls

  如果在VM non-root下執行MOV CR3不會導緻VM退出,如果CR3目标計數為0,則會導緻VM退出,目标計數大于4,VM條目失敗,MSR IA32_VMX_MISC。VMCS-pointer用于管理中斷SMI和系統管模式SMM。

4) VM-exit control fields: VM出口

生成32-bit向量,負責VM退出

9:主機位址空間大小,對于不持支Inetl 64必須為0

15: 退出時候确認中斷

5) VM-entry control fields:VM入口

9 IA-32e mode guest

10 進入SMM

11 停用雙重監控

6) VM-exit information fields

7) VM執行/退出/進入統稱 VMX controls

通路VMCS需要遵循的規則

  1. 處理器是否提供VM exit 資訊MSR IA32_VMX_BASIC來确定,不可以在多個邏輯處理器活動,

    MVCS遷移至另一個處理器,第一個處理器VMCS執行VMCLEAR,保證不活動且VMPTRLD之前。

  2. 應該使用VMREAD/VMWRITE來通路VMCS資料
  3. vm條目進入VMCS之前應該初始化全部條目

24章

System Management mode (SMM) Overvlew

  SMM是特殊的模式,如處理電源管理,系統硬體控制或專有的OEM設計代碼,他供系統硬體使用,好處提供了獨特易于隔離的處理器環境,透明的運作。

  當通過系統中斷(SMI)調用SMM時候,儲存處理器上下文,處理器切換到一個分離的位址控件,SMM指定代碼透明執行,如磁盤未關閉之類的,SMI處理完成後,RSM指令使處理器重新加載已儲存的上下文,切換回實際模式,回複執行中斷的應用程式或任務。

  1. 進入SMM的唯一方法是SMI。
  2. 處理器執行SMM代碼在單獨的位址控件SMRAM,其它無權通路。
  3. 進入SMM,處理器儲存被中斷程式或任務上線文。
  4. 進入SMM,全部中斷通常由作業系統處理禁用。
  5. RSM隻能在SMM中執行。
  6. SMM進行中,不支援引入的實體擴充PAE機制。
  7. SMM像實模式一樣,沒有特權等級和位址映射。

    System management mode and Virtual-machine extensions Operation

      預設方式:系統固件處理SMI,處理器進入SMM時候儲存VMX狀态,SMI處理完成,使用RSM恢複VMX操作。

      雙從螢幕:兩個VM螢幕協同處理SMIs:一個VMM在SMM之外運作,為Guest 提供支援,另一個運作在SMM内部,支援系統管理功能

    System Management Interrupt(SMI)

    當處理器在SMM中SMI禁用狀态:

      進入SMM,當接收到SMI,等地所有指令退出/存儲完成,儲存處理器上線文至SMRAM,進入SMM執行SMI處理程式。進入到處理器後,SMM處理器向外部發送信号告訴已開始處理SMM,SMI優先級最高

    SMRAM

      SMRAM映射到實體記憶體大小可達4GB,預設的64kb,30000H,SMBASE+8000H查找第一條SMI指令,将處理器狀态存儲在SMBASE+FE00H~SMBASE+FFFFH。
Intel Vt虛拟化筆記

百度相關文獻的時候,發現一篇翻譯SMM,發現自己英語太差了,是以學習翻譯版該章節

https://blog.csdn.net/humanof/article/details/94621498

25章

  VMX系統程式設計概述,每一個VM就如一個完整的虛拟機,運作最特權級别,并擁有底層硬體所屬權.VMM控制建立VM,管理VM與VM之間的轉換情況,VMM允許VM共享底層硬體且隔離。

實模式的來賓模式:

  1. 通過VMM使用快速指令集仿真器
    Intel Vt虛拟化筆記
Intel Vt虛拟化筆記

  進入VMX之前必須申請一個VMXON區域,VMM通過IA32_VMX_BASIC MSR讀取VMCS,使用4KByte對齊的實體記憶體區域建立此大小的VMCS區域,軟體不能讀取和寫入VMCS區域。

  VMM通過VMPTRLD指令辨別目前VMCS,隻能通過VMREAD/VMWRITE進行VMCS讀寫操作。

Intel Vt虛拟化筆記

a) VMX處理和轉換,從外部VMX操作VMXON,進入到根VMX操作,VM條目進入意味着根VMX轉換到了非根VMX,VM 條目退出是從VMX non-root轉換成VMX。

VMM安裝和解除安裝

VMX之前需要確定分頁下運作:

  1. 檢測CPUID是否支援VMX
  2. 通過MSRs确認處理器支援VMX
  3. MSR指定IA32_VMX_BASIC大小非分頁建立VMXON區域,對其至4kb邊界。
  4. 軟體讀取MSR,确定可用的VMXON區域實體範圍,VMXON必須托管在緩存相關記憶體中
  5. 初始化VMXON中的前32bit版本号
  6. 滿足PE/PG=1,
  7. CR4.VMXE=1啟用VMX操作,確定生成CR4值屬于IA32_VMX_CR4_FIXDE0和FIXDE1固定值
  8. IA32_FEATURE_CONTROL MSR 卻把bit(0) = 1;
  9. 使用EFLAGS.CF = 0/VMXON

    上述步驟完成,處理器出入VMX root中。

    準備和啟動虛拟機

    VMM設定和啟動Guest Vm步驟
  10. VMX能力MSR指定的大小不可分頁的記憶體中建立一個VMCS區域IA32_VMX_BASIC并對齊到4KBytes
  11. IA32_VMX_BASIC初始化前32Bit
  12. 來賓-VMCS位址執行VMCLEAR結構,初始化記憶體中新的VMCS,且設定為清除。還需要檢測RFLAGS.CF=0/RFLAGS.ZF=0
  13. VMCS位址執行VMPTRLD指令初始化工作
  14. 發出一系列VMWRITE用來初始化主機狀态(各類的寄存器)。
  15. VM條目一緻性檢查

    處理VM出口

  16. VMREAD讀取确定退出原因
  17. 有效資格提供了更多細節
  18. VMCS擷取退出其它字段
  19. VMM适當處理退出條件。

    多處理器考慮:

  20. 對稱VMM?---不對稱VMM 指的CPU

26章系統資源虛拟化

  當VMM托管多個來賓時候,調試設施/位址轉換/實體記憶體/微碼更新設施,調試設施虛拟化支援,Inetl64和IA-32 提供了斷點指令,異常條件,寄存器标志,調試寄存器,控制寄存器和存儲緩沖區,調試系統軟體。

  1. 可以對異常進行處理,如int3
  2. 可以像Gust注入異常
  3. DR0~DR7

    記憶體虛拟化

  4. VMM必須控制實體記憶體,確定實體隔離,重新映射主機與來賓之間的記憶體位址關系。
  5. 需要支援來賓虛拟化,包括所有模式,VMM可以利用分頁結構來支援虛拟化記憶體。VMM可以再來賓和線性位址之間映射一個平面頁表。
  6. VMX提供給VMM提供了VM完全監視(PAT/MSR/MTRR),VMM給VM提供連續的記憶體控件,從0開始直到VM支援的最大位址。
  7. 為了解決來賓軟體可以随意的修改頁表(VMM),是以活動頁表和來賓頁表結構可能有所不一,那麼利用TLB可以解決這個問題。允許來賓自由通路頁面目錄和頁表,陷阱發生在CR3通路和執行,INVLPG上,VMM維護了一個可供可選擇的頁表層次結構,VMM支援TLB。

28章

virtual-processor identfiers VIPDs,可以通過VPID來切換線性位址,VMX會儲存緩存資訊。

目前VPID為0的時候:

  • VMX root 操作
  • VMX 非root

    EPT使用的時候,來賓的實體位址通過周遊一組EPT分頁來結果用于通路記憶體的實體位址。

  • 如果CR0.PG=0,每個線性位址将視為來賓位址
  • 如果CR0.PG=1,都是來賓分頁派生的位址
  • 如果PG=1/CR4.PAE = CR4.PSE = 0

VM程式設計

1) 檢測系統版本

2) 檢測是否支援VMX

// See: DISCOVERING SUPPORT FOR VMX

繼續閱讀