1. 程式人生 > >VT系列:將程式碼移植到多核模式

VT系列:將程式碼移植到多核模式

本文只是學習此視訊後的一些總結 不當之處還請指出

視訊作者:小寶來了

視訊連線:http://bbs.pediy.com/showthread.php?t=211973 

程式碼可以到上面的連結下載或我的資源裡下載

http://download.csdn.net/detail/zhuhuibeishadiao/9637786


遇到的問題大概為以下6個
1. 如何讓程式碼執行在指定CPU
2. 虛擬機器記憶體重疊問題
3. 儲存虛擬機器暫存器結構記憶體重疊問題
4. IRQL、多執行緒問題
5. 如果獲取當前程式碼執行的CPU
6. 有多少CPU


1.讓程式碼執行在指定CPU可以使用KeSetSystemAffinityThread來設定當前程式碼執行在哪個CPU上
然後執行完後要呼叫KeRevertToUserAffinityThread回到原來的佇列中即可
需要注意的是 這裡需要進行位運算
KeSetSystemAffinityThread((KAFFINITY)(1 << i)); i代表要讓程式碼執行在i cpu上


2.虛擬機器記憶體重疊問題
只需要把重疊的記憶體重新分配就行,這裡使用陣列 ,每個CPU都必須都有自己的虛擬機器記憶體區.
程式碼中把g_VMXCPU 改成了大小為128的陣列 其他地方替換即可


3.跟上面很類似 比如當系統呼叫CPUID時,0號處理器的eax是1,但如果1號處理器把這個eax改成0就出錯了,所以也必須給每個cpu分配自己的暫存器儲存區。
程式碼中把g_GuestRegs改成了大小為128的陣列 其他地方替換即可


4.IRQL問題
  很多開源VT程式碼中使用申請記憶體的函式是MmAllocateNonCachedMemory 但如果沒有處理IRQL問題 則為發生IRQL問題
解決的方法也很簡單,將開啟VT的程式碼前將IRQL提升到DPC級別,執行完畢後降到0即可,這裡還有多執行緒的問題。這裡不多說。


5.通過KeGetCurrentProcessorNumber


6.全域性變數KeNumberProcessors