我正在研究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核心。
我是否错过了重要的事情?
答案 0 :(得分:3)
在使用vmxoff之前,首先需要在任何想要再次使用的VMCS上使用vmclear。
如果您想使用已完成vmclear的VMCS恢复VM,则需要使用vmlaunch,而不是vmresume。
所以,如果你想使用vmresume,你不能做vmclear或vmxoff。
见SDM第24.1和24.11节。