VMresume因未启动的VMCS而失败,如何处理它?

时间:2018-05-12 07:56:08

标签: linux x86 x86-64 virtualization

我正在研究Linux内核模块和用户空间程序来测试VMX 该代码在带有Broadwell CPU的Ubuntu16.04笔记本电脑上运行。

用户空间程序将调用内核模块代码来执行VMX指令以运行测试VM,例如vmxon,vmclear,vmptrld,vmlaunch,vmxoff以vmlaunce VM,或vmxon,vmptrld,vmresume,vmxoff以恢复VM执行。

在VMexit之后(切换回用户空间程序以检查VM状态,然后返回内核空间继续VMX操作),模块将调用vmresume来恢复VM,但vmresume失败,指令错误号为5 ,这意味着'使用未启动的VMCS调用vmresume'。

然后,我更改了代码,而没有切换回用户空间,只需在内核空间(内核模块)中运行vmlaunch,(vmexit)和vmresume,它就可以正常工作。

为了检查失败的原因,我改回来使用用户空间。并使用'sched_setaffinity'将我的所有VMX执行绑定到一个CPU内核中,并在每个vmexit或vmx指令错误上转储VMCS。

我仍然遇到这个错误,即使内核日志显示这些VMX操作都在一个CPU中执行,例如CPU0。并且VMCS转储在失败后显示几乎为空的VMCS。

我不知道为什么单个VMCS区域出现此错误并绑定到CPU核心。

我是否错过了重要的事情?

1 个答案:

答案 0 :(得分:3)

在使用vmxoff之前,首先需要在任何想要再次使用的VMCS上使用vmclear。

如果您想使用已完成vmclear的VMCS恢复VM,则需要使用vmlaunch,而不是vmresume。

所以,如果你想使用vmresume,你不能做vmclear或vmxoff。

见SDM第24.1和24.11节。