看流星社区

 找回密码
 注册账号
查看: 1613|回复: 0

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

[复制链接]

该用户从未签到

发表于 2017-6-1 12:17:31 | 显示全部楼层 |阅读模式




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

视频作者:小宝来了

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

   





点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 05:21

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表