寫在前面
此系列是本人一個字一個字碼出來的,包括示例和實驗截圖。由於系統內核的復雜性,故可能有錯誤或者不全面的地方,如有錯誤,歡迎批評指正,本教程將會長期更新。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閑錢,可以打賞支持我的創作。如想轉載,請把我的轉載信息附在文章后面,並聲明我的個人信息和本人博客地址即可,但必須事先通知我。
你如果是從中間插過來看的,請仔細閱讀 羽夏看Win系統內核——簡述 ,方便學習本教程。
看此教程之前,問幾個問題,基礎知識儲備好了嗎?保護模式篇學會了嗎?練習做完了嗎?沒有的話就不要繼續了。
🔒 華麗的分割線 🔒
初識
如下的內容節選自New Blue Pill
並略微修改以更好的入門VT
。如果自己了解這些基本概念,就沒必要看初識了。
在討論VT
之前我們首先談談虛擬概念。虛擬virtualization
是指對計算機資源的抽象,一種常用的定義是:“虛擬就是這樣的一種技術,它隱藏了系統、應用和終端用戶賴以交互的計算機資源的物理性的一面,最常用的方法就是把單一的物理資源轉化為多個邏輯資源,當然也可以把多個物理資源轉化為一個邏輯資源(這在存儲設備和服務器上很常見)。”
在2005年和2006年,Intel
和AMD
都開發出了支持硬件虛擬技術的CPU
,也就是在此時,x86
平台才真正有可能實現完全虛擬化。2007年年初,Intel
還進一步地發布了VT-d
技術規范,從而在硬件上支持IO
操作的虛擬化。隨着硬件虛擬化技術越來越廣泛的采用,開發者也開始用虛擬技術來做一些其他的事情。
有了虛擬技術的基本概念,下面我們談談硬件虛擬化技術HEV
。硬件虛擬化技術Hardware Enabled Virtualization,HEV
也就是在硬件層面上,更確切地說是在CPU
里對虛擬技術提供直接支持,並通過這種設計提高虛擬效率、降低開發難度。在硬件虛擬化技術誕生前,在編寫虛擬機的過程中,為了實現多個虛擬機上的真實物理地址隔離,需要編程實現把客戶機的物理地址翻譯為真實機器的物理地址。同時也需要給不同的客戶機操作系統編寫不同的虛擬設備驅動程序,使之能夠共享同一真實硬件資源。硬件虛擬化技術則在硬件上實現了內存地址甚至於IO
設備的映射,因此大大簡化了編寫虛擬機的過程。而其硬件直接支持二次尋址和I/O
映射的特性也提升了虛擬機在運行時的性能。
在硬件虛擬化技術中,一個重要的概念就是VMM
,英文全稱為Virtual Machine Monitor
,有的書稱之為Hypervisor
,它專指在使用硬件虛擬化技術時創建出的特權層,該層提供給虛擬機開發者,用來實現虛擬硬件與真實硬件的通信和一些事件處理操作,因此它的權限級別要大於或等於操作系統權限。如下為硬件虛擬化技術架構示意圖:
如下是VMM
的使用架構示意圖:
由於我們介紹的是Intel
的VT
技術,所以我們關注的是Intel-VTx
。在VT
技術中,設計架構上同樣存在兩種角色—虛擬機管理器Virtual Machine Monitors,VMM
和客戶機Guest
,兩者分處在VMX root
和VMX non-root
兩種模式下。VT
技術的設計目標如下。
對於VMM
層,進入此層則代表進入了VMX root
模式:
- 為每個虛擬機提供虛擬處理器,並且可以在恰當的時候把它放在真正的物理處理器上,從而使得這個虛擬處理器可以處理指令。
VMM
層可以控制處理器資源、物理內存、管理中斷和IO
操作。
對於Guest Machine
,進入此層則代表進入了VMX non-root
模式:
- 每個虛擬機使用相同的接口來使用虛擬處理器、內存、存儲設備等資源。
- 每個虛擬機可以獨立地不受干擾地運行,虛擬機間都是相互獨立的。
- 對於虛擬機來說,
VMM
層像是完全透明的。
如下是VMM
的生命周期示意圖:
之前我們學過內核、驅動以及程序編寫,我們可以做一個對比:
有了這些基本概念之后,我們就可以比較方便的繼續后續的入門。
准備
在簡述當中,我們強調了要求有驅動開發的基礎,如果不會的話,請把 羽夏看Win系統內核——驅動篇 學習完畢再回來進行,當然保護模式的知識是基礎也不要落下。
要實現VT
最小框架,就需要一些匯編指令,比如vmxon
等指令。這一切的一切編譯器並沒有提供,但是,微軟幫我們實現了這些功能,使得我們不必需要自己寫匯編來實現,提高代碼的可移植性,否則我們寫32
位的VT
移植到64
位有一些是不一樣的,需要自己重新修改構建。只需要在驅動項目中引用intrin.h
這個頭文件即可使用,x86 內部函數列表 中包含了所有的微軟幫我們實現的函數。
由於我們是最小的VT
架構實現,請把虛擬機按照我們初學保護模式的配置:單核、32位的WinXP
,於此同時要開啟嵌套VT-x/AMD/V
,否則就算你的VT
架構代碼寫的是對的,也報錯:
推薦項目
在GitHub
上有比較成熟的項目 HyperPlatform ,學習好入門之后,可以根據自己的需要進行拓展。