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

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
发表于 2018-7-15 15:51:10 | 显示全部楼层 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

代码可以到上面的链接下载或我的资源里下载

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


回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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