我正在研究Linux内核模块和用户空间程序以测试VMX。
该代码在具有Broadwell CPU的Ubuntu16.04笔记本电脑中运行。
用户空间程序将调用内核模块代码以执行VMX指令以运行测试VM,例如将vmxon,vmclear,vmptrld,vmlaunch,vmxoff转换为vmlaunce,或将vmxon,vmptrld,vmresume,vmxoff恢复到VM。
VMexit之后(切换回用户空间程序以检查VM状态,然后返回到内核空间以继续VMX操作),模块将调用vmresume来恢复VM,但是vmresume失败,指令错误号为5,这意味着“使用未启动的VMCS调用vmresume”。
然后,我更改了代码,而无需切换回用户空间,只需在内核空间(内核模块)中运行vmlaunch,(vmexit)和vmresume,它将可以正常工作。
为了检查失败的原因,我改回使用用户空间。并使用“sched_setaffinity”将我所有的VMX执行绑定(bind)在一个CPU内核中,并在每个vmexit或vmx指令错误上转储VMCS。
我仍然遇到此错误,即使内核日志显示这些VMX操作都在一个CPU中执行,例如CPU0。故障后,VMCS转储显示几乎为空的VMCS。
我不知道为什么用单个VMCS区域并绑定(bind)到CPU内核会遇到此错误。
我错过了重要的事情吗?
最佳答案
使用vmxoff之前,首先需要在要再次使用的所有VMCS上使用vmclear。
每当您要使用已完成vmclear的VMCS恢复虚拟机时,都需要使用vmlaunch而不是vmresume。
因此,如果要使用vmresume,则一定不要执行vmclear或vmxoff。
请参阅SDM的24.1和24.11节。