0

我正在尝试在我的 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

这意味着进位标志打开(因此,地址可能无效 - 不知道为什么)。

有什么建议么?几乎所有东西都试过了=[

4

0 回答 0