Windows內核分析索引目錄:https://www.cnblogs.com/onetrainee/p/11675224.html
VT開啟前的檢測與開啟
該部分代碼位於:VtCode2 中。
一、VT開啟前的檢測工作
1)2.2.3 檢測CPU是否支持VT:
1> 使用CPUID指令(Intel手冊卷2查看該指令):CPUID指令01號功能,返回在ECX的第五位表示VMX,如果VMX=1,則表示CPU已經開啟VT功能。
2> 因此使用如代碼判斷CPU是否支持VT功能。
2)2.3.2.1 IA32_FEATURE_CONTROL寄存器
1> 在MSR中的地址:3AH(Intel手冊卷3 23.3 VMX operation中)
2> windbg: rdmsr 3a 顯示其為 05h, 101b,第一位lock位鎖住,第三位在SMX模式之外執行VMXON(上面Intel手冊下面介紹的就是這個)。
3> 因此借助 第3位來監測主板是否開啟VT
3)2.3.2.2 CR0與CR4固定位
1> CR0有些位需要進行設置(操作系統已經幫我們設置好了)。
2> CR4寄存器需要開啟VMXE位/13位。(Intel手冊卷3 2.5 控制寄存器)
雖然說了很多,但本質上講該位置為1,判斷也是如此,因此我們使用如下代碼判斷VT是否開啟。
二、VMXON區域初始化 2.3.3
在Intel卷3 31.5 VMM SetUp 中介紹了VMXON開始需要一塊非分頁內存,並且記錄好其物理地址。
1)我們對每一個核申請一個單獨的VMX入口。(注意,這個結構我們日后隨着學習的深入會繼續補充)
1> VMX入口數據結構
2> 全局變量對每個核定義一個入口(最多128核)
2)VMXOnArea 存放VMCSID的值(參考2.3.3章節說明),然后我們直接來讀取smr來賦值。
3)不同核雖然入口不同,但其共同使用一個VMM區域,因此在不同核處理時,其申請同一個內存且賦上物理地址(猜測!!!不負責!!!!!)
書上說明:
實際在每個核中對申請內存的操作:
4)我們設置前面說的CR4的VMXE位/13位,設置好,之后我們也是通過這個位來監測VT是否開啟。
之后調用微軟提供的IntelApi __vmx_on(),來開啟VMXON,如果開啟成功則返回零(詳情查看msdn),如果開啟不成功,則直接釋放內存。