Memory 使用VMX模拟内存映射I/O是否需要指令解码?

Memory 使用VMX模拟内存映射I/O是否需要指令解码?,memory,assembly,virtualization,Memory,Assembly,Virtualization,我想知道使用Intel的VMX/VT技术的虚拟机监控程序如何模拟内存映射的I/O(这样客户就可以认为它正在对Insta设备执行内存映射的I/O) 我认为基本原则应该是设置EPT页表,使相关内存地址无法读取或写入,从而导致EPT冲突(即VM退出)?然而,下一个问题是如何处理VM出口。这样的VM退出将填写所有退出资格理由等,包括来宾线性地址和来宾物理地址等。但我在这些退出资格字段中缺少的是某个字段,该字段指示(如果是写入指令)尝试写入的值和写入的大小。同样,对于读取指令,最好使用一些位字段来指示读取

我想知道使用Intel的VMX/VT技术的虚拟机监控程序如何模拟内存映射的I/O(这样客户就可以认为它正在对Insta设备执行内存映射的I/O)

我认为基本原则应该是设置EPT页表,使相关内存地址无法读取或写入,从而导致EPT冲突(即VM退出)?然而,下一个问题是如何处理VM出口。这样的VM退出将填写所有退出资格理由等,包括来宾线性地址和来宾物理地址等。但我在这些退出资格字段中缺少的是某个字段,该字段指示(如果是写入指令)尝试写入的值和写入的大小。同样,对于读取指令,最好使用一些位字段来指示读取的目的地,比如寄存器或内存位置(在内存到内存字符串操作的情况下)。这将使hypervisor很容易了解来宾试图做什么,然后模拟设备对来宾的行为

但问题是,我在退出资格中找不到这样的领域。我可以看到一个指向出错指令所在位置的指令指针,因此我可以遍历页表读取指令,然后对其进行解码以理解指令,然后模拟I/O行为。然而,这要求虚拟机监控程序对所有x86指令有一个相当完整的了解,并能够对它们进行解码。这对虚拟机监控程序来说似乎是一个相当沉重的负担,并且还需要它在以后的指令添加中保持最新状态。CPU应该已经有了这些信息


有可能我遗漏了这些相关字段,因为文档非常广泛,但我已尝试仔细搜索,但未能找到。也许有人可以给我指出正确的方向,或者确认虚拟机监控程序需要包含指令解码器。

我相信大多数虚拟机都会对指令进行解码。事实上,这并不难,当CPU虚拟机扩展不可用或无法完成任务时,大多数虚拟机都有软件仿真器可供使用。您不需要处理每一条指令,只需要处理那些可以占用内存操作数的指令,而且您可能会忽略所有不是1、2或4字节内存操作数的指令,因为您不太可能模拟除这些大小以外的设备寄存器。(对于内存映射设备缓冲区,如视频内存,您不希望捕获每个内存访问,因为这太慢,因此您必须采取不同的方法。)

然而,有一种方法可以让CPU为您完成这项工作,但它比解码指令本身慢得多,而且并不完全完美。您可以在临时映射到RAM的有效页面时单步执行指令。VM出口将告诉您来宾物理地址访问以及它是读还是写。不幸的是,它不能可靠地告诉您它是否是读-修改-写指令,这些指令可能只是设置写标志,而某些设备寄存器可能会产生影响。复制指令(最多只能是15个字节,但要注意页面边界)并在主机中执行它可能会更容易,但这要求您可以将页面映射到主机中与来宾中相同的虚拟地址

您可以结合这些技术,对实际用于访问内存映射设备寄存器的公共指令进行解码,同时对无法识别的指令使用单步执行


请注意,选择编写自己的虚拟机监控程序给自己带来了沉重的负担。与模拟整个IBM PC兼容计算机的任务相比,在软件中解码指令是一个相当小的负担。“英特尔虚拟化扩展”的设计目的并不是让这变得更简单,而是让它更高效。编写解释指令的纯软件仿真器会更容易。处理内存映射I/O只需将读写操作分派到正确的函数

我不知道VT-X是如何工作的,但我想我看到了您希望的工作方式中的一个缺陷:

请记住,x86不是加载/存储机器添加[rdi]的加载部分,2没有体系结构上可见的目标,因此您建议的告诉虚拟机监控程序在何处查找或放置数据的解决方案实际上不起作用,除非有一些临时位置不是来宾体系结构状态的一部分,仅用于虚拟机监控程序和VMX硬件之间的通信

为了有效地处理带有内存目标的读-修改-写指令,VM应该使用一个VM出口完成全部工作。因此,您不能只提供单独的加载和存储接口


更重要的是,处理原子读修改写是一种特殊情况<代码>锁添加[rdi],2不能作为单独的加载和存储来完成。

我误解了你的问题。不过,你可能想看看英特尔的论文,因为它涉及IO虚拟化。如果你把这堵巨大的文本墙分成多个段落,它将大大提高可读性。有趣的标题,但是没有兴趣涉过这堵巨大的单段文字墙。@Peter:如果你指的是这个,我已经插入了一些中断。嗨,罗斯,谢谢,我很感谢你的回答。这也符合我的担心/期望。我真想知道为什么英特尔没有实现这个功能。软件解码也必须产生开销,CPU有一个专用的硬件解码器。这只是将一些控制信号放入VM寄存器的问题,它将推广到所有指令类。我明白你关于VMX的观点不