我正在尝试在我的 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;
}
为了安全起见,我将其余字节归零(不知道是否真的有必要)。
我做的最后一件事是使用以下命令启动 vmxon:
uint64_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
这意味着进位标志打开(因此,地址可能无效 - 不知道为什么)。
有什么建议么?几乎所有东西都试过了=[