我正在尝试在OS X 10.9.4上运行虚拟机管理程序,但VMXON拒绝运行。 我的系统规格:Intel core i5 2.4,8gb ram
我做了以下事情: 1)检查CPU是否支持使用cpuid的VMX。 2)打开CR0和CR4寄存器中所有需要的位。检查需要使用0x486,0x488和RDMSR打开哪些位。 3)使用以下命令为VMX区域分配内存:
if ((vmxon_region = IOBufferMemoryDescriptor::inTaskWithOptions(kernel_task, kIOMemoryPhysicallyContiguous , 0x400, PAGE_SIZE)) == NULL) {
IOLog("LOG : Failed to allocate memory. Aborting \n");
return kIOReturnAborted;
}
4)使用以下命令将VMX REV ID复制到区域的前4个字节:
(vmx_rev_id包含取自rdmsr的0x480低部分的vmx版本ID。 在我的情况下(Core i5),值为12HEX)
if ((vmxon_region->writeBytes(0, &vmx_rev_id, sizeof(int))) < sizeof(int)) {
IOLog("LOG : Failed to write to the vmx region. Aborting. \n");
return kIOReturnAborted;
}
为了安全起见,我把剩下的字节归零(不知道是否真的有必要)。
我做的最后一件事是用:
启动vmxonuint64_t physicalAddr = vmxon_region->getPhysicalAddress();
asm volatile("vmxon %0; "::"g"(&physicalAddr));
asm volatile("jbe vmxon_fail\n");
vmxon_success = 1;
asm volatile("jmp vmxon_finish\n"
"vmxon_fail:\n"
"pushfq\n"
);
asm volatile ("popq %0\n"
:
:"m"(rflags_value)
:"memory"
);
vmxon_success = 0;
asm volatile("vmxon_finish:\n");
此代码后rflags_value的值为:515
表示进位标志已打开(因此,地址可能无效 - 不知道为什么)。
有什么建议吗?几乎尝试了一切= [