VMresume 因未启动的 VMCS 而失败,如何处理?
VMresume failed with unlaunched VMCS, how to deal with it?
我正在开发一个 Linux 内核模块和一个用户 space 程序来测试 VMX。
代码在带有 Broadwell CPU 的 Ubuntu16.04 笔记本电脑中 运行ning。
用户space程序将调用内核模块代码对运行测试VM执行VMX指令,例如vmxon、vmclear、vmptrld、vmlaunch、vmxoff以vmlaunce VM,或vmxon , vmptrld, vmresume, vmxoff 以恢复 VM 执行。
VMexit 后(切换回用户 space 程序检查 VM 状态,然后返回内核 space 继续 VMX 操作),模块将调用 vmresume 恢复 VM , 但 vmresume 失败,指令错误号为 5,这意味着 'call vmresume with a non-launched VMCS'。
然后,我更改了代码,没有切换回用户 space,只是 运行 内核中的 vmlaunch、(vmexit) 和 vmresume space(内核模块) ,它将正常工作。
为了检查失败的原因,我改回使用用户space。并使用 'sched_setaffinity' 将我所有的 VMX 执行绑定在一个 CPU 核心中,并在每个 vmexit 或 vmx 指令错误上转储 VMCS。
我仍然遇到这个错误,甚至内核日志显示这些 VMX 操作都在一个 CPU 中执行,例如CPU0。失败后 VMCS 转储显示 VMCS 几乎为空。
我不知道为什么使用单个 VMCS 区域并绑定到 CPU 核心时会出现此错误。
我是不是漏掉了什么重要的东西?
在使用 vmxoff 之前,您首先需要在您希望能够再次使用的任何 VMCS 上使用 vmclear。
任何时候您想要使用已完成 vmclear 的 VMCS 恢复 VM,您都需要使用 vmlaunch,而不是 vmresume。
因此,如果要使用 vmresume,则一定不要执行 vmclear 或 vmxoff。
请参阅 SDM 的第 24.1 和 24.11 节。
我正在开发一个 Linux 内核模块和一个用户 space 程序来测试 VMX。
代码在带有 Broadwell CPU 的 Ubuntu16.04 笔记本电脑中 运行ning。
用户space程序将调用内核模块代码对运行测试VM执行VMX指令,例如vmxon、vmclear、vmptrld、vmlaunch、vmxoff以vmlaunce VM,或vmxon , vmptrld, vmresume, vmxoff 以恢复 VM 执行。
VMexit 后(切换回用户 space 程序检查 VM 状态,然后返回内核 space 继续 VMX 操作),模块将调用 vmresume 恢复 VM , 但 vmresume 失败,指令错误号为 5,这意味着 'call vmresume with a non-launched VMCS'。
然后,我更改了代码,没有切换回用户 space,只是 运行 内核中的 vmlaunch、(vmexit) 和 vmresume space(内核模块) ,它将正常工作。
为了检查失败的原因,我改回使用用户space。并使用 'sched_setaffinity' 将我所有的 VMX 执行绑定在一个 CPU 核心中,并在每个 vmexit 或 vmx 指令错误上转储 VMCS。
我仍然遇到这个错误,甚至内核日志显示这些 VMX 操作都在一个 CPU 中执行,例如CPU0。失败后 VMCS 转储显示 VMCS 几乎为空。
我不知道为什么使用单个 VMCS 区域并绑定到 CPU 核心时会出现此错误。
我是不是漏掉了什么重要的东西?
在使用 vmxoff 之前,您首先需要在您希望能够再次使用的任何 VMCS 上使用 vmclear。
任何时候您想要使用已完成 vmclear 的 VMCS 恢复 VM,您都需要使用 vmlaunch,而不是 vmresume。
因此,如果要使用 vmresume,则一定不要执行 vmclear 或 vmxoff。
请参阅 SDM 的第 24.1 和 24.11 节。