VT系列:将代码移植到多核模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuhuibeishadiao/article/details/52635296

本文只是学习此视频后的一些总结 不当之处还请指出

视频作者:小宝来了

视频连接: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

猜你喜欢

转载自blog.csdn.net/zhuhuibeishadiao/article/details/52635296
今日推荐