- 1. 概述
- 2. 虚拟设备
- 2.1. 外部中断控制权在guest上
- 2.2. 外部中断控制权在VMM上
- 2.3. 外部设备所有权归VMM
- 2.4. 外部设备所有权归VM
- 3. 地址转换
- 4. 设备的I/O访问
1. 概述
虚拟机的运用需要以处理器平台提供Virtualization Technology(VT, 虚拟化技术)为前提, 是以资源的虚拟化管理的结果. 在虚拟化技术之前, 软件运行在物理机器上, 对物理资源进行直接控制, 譬如设备的中断请求, guest的内存访问, 设备的I/O访问等. 软件更改这些资源的状态将直接反映在物理资源上, 或设备的请求得到直接响应.
在CPU端的虚拟化里, 实现了VMX(Virtual-Machine Extensions, 虚拟机扩展)架构. 这个虚拟机架构中, 存在两种角色环境: VMM(Virtual Machine Monitor, 虚拟机监管者)和VM(Virtual Machine, 虚拟机). host端软件运行在VMM环境中, 可以仅作为hypervisor角色存在(作为全职的虚拟机管理者), 或者包括VMM(虚拟机监管者)职能的host OS.
guest端软件运行在VM环境中. 一个VM代表一个虚拟机实例, 一个处理器平台可以有多个虚拟机实例, 由于VM里的资源被虚拟化, 每个MV彼此独立.
guest软件访问的资源受到VMM监管, guest希望修改某些物理资源时, VMM返回一个虚拟化后的结果给guest. 例如, guest软件对8259控制器的状态进行修改, VMM拦截这个修改, 进行虚拟化操作, 实时修改或不修改8259控制器的物理状态, 反馈一个不真实的结果给guest软件.
下图展示前面提到的虚拟化环境里的三种虚拟化管理:
(1) 设备中断请求
(2) guest内存访问
(3) 设备的I/O访问
设备的中断请求经由VMM监管, 模拟出虚拟设备(!!!)反馈一个虚拟中断给guest执行, 在这个模型中, 设备中断请求不直接发给guest执行.
而guest访问的物理地址也不是最终的物理地址, 而是经过EPT进行转换才得到的最终物理地址.
设备1和设备2使用DMA访问时, 它们最终的目标物理地址经过VT-d(!!!)技术的DMA重新映射功能映射到属于自己的domain(区域).
2. 虚拟设备
在设备发生中断请求时, 这就产生设备的ISR(中断服务例程)是由VMM(或host OS)处理!!!, 还是直接由VM(guest OS)处理(或由VMM转发给VM!!!)的问题, 即ISR是运行在host还是guest端的问题.
依赖于VMM对外部设备所有权的设计产生两种模型(!!!):
- 设备是属于host所有, 物理设备的ISR由VMM来执行.
- 设备分配给VM使用, 那么ISR将在guest环境里运行.
host和guest都有自己的IDT(中断描述符表), host vector对应物理设备ISR在host IDT的位置, 而guest vector对应着VMM反馈给guest的中断请求在guest IDT上的位置. 中断请求通过VMM给VM使用injection event(注入事件!!!)的手段来实现.
2.1. 外部中断控制权在guest上
host vector和guest vector并不相等, 但在设备分配给VM使用的模型里, 若外部中断控制权在guest手上, 那么guest vector可以对应物理设备ISR在guest IDT的位置, 也就是物理设备ISR完全由guest执行, 而VMM并不监管或转发.
2.2. 外部中断控制权在VMM上
如果外部中断的控制权需要掌握在VMM(即host)手中, 通过开启"external-interrupt exiting!!!"功能, 并且结合"acknowledge interrupt on exit"位!!!的设置来实现. 当发生外部中断时, VM停止工作, 处理器控制权切换回VMM.
2.3. 外部设备所有权归VMM
在设备所有权归VMM(!!!)的模型里, 虚拟设备产生了, 它是VMM在物理设备之上抽象出来的虚拟设备概念.
中断发生, VMM的vector是物理设备对应在host IDT里, VMM执行物理设备的ISR. 然后模拟guest的ISR处理流程, 如发送EOI命令给中断控制器, 更新中断控制器状态. 根据对应的guest vector注入一个外部中断给guest(!!!)在自己的IDT找到ISR执行, 这个guest ISR可能并不能做实际收尾工作, 如发送EOI命令(被VMM接管)或更新中断控制器.
host vector代表着来自平台的物理设备, 而guest vector代表来自虚拟设备, 这两个vector值不一致, 这个虚拟设备由VMM维护而代表着物理设备在VM环境中的名字. 虚拟设备可能并不存在实体功能, 只是逻辑表述上的抽象概念.
2.4. 外部设备所有权归VM
在设备分配给VM使用的模型里, guest vector与host vector可能一致也可能不一致, 但物理设备的ISR由guest去运行, 代表着ISR的收尾工作由guest去执行. VMM截取中断请求后根据guest vector, 同样使用事件注入手段转发外部中断给guest执行, 而VMM可能并不做其他工作. 这是在host夺取外部中断控制器的前提下, 前面所述在guest掌控外部中断权时, 设备ISR直接在guest中执行.
当然, VMM也可以不拦截外部中断(!!!), 这样外部中断就直接通过guest-IDT进行deliver执行, 而不需要经过VMM转发.
3. 地址转换
EPT和guest paging-structure table
host软件和guest软件都运行在物理平台上, 需要guest不能干扰VMM的执行. 比如, guest软件访问100000h物理地址, 但这个物理地址可能属于host的私有空间, 或者host也需要访问100000h物理地址. VMM的设计需要guest不能访问到这个真实的物理地址, VMM通过EPT(Extend Page Table, 扩展页表)来实现"guest端物理地址到host端物理地址"的转换, 使得guest访问到其他的物理区域.
EPT是内存虚拟化的重要手段. EPT的实现原理和分页机制里的转换页表一样, 经过多级转换产生最终的物理地址.
在开启EPT机制, 产生两个地址概念: GPA(Guest Physical Address)和HPA(Host Physical Address), HPA是真正的物理地址. guest软件访问的物理地址(!!!)都属于GPA, 而host软件访问的物理地址则属于HPA. 而没启用EPT机制情况下, guest软件访问的物理地址就是最终的物理地址.
另一个概念: guest paging-structure table(guest的页结构表), 也就是guest内保护模式分页机制下的线性地址到物理地址转换使用的页表. 这个页表项内使用的物理地址是GPA(例如CR3的页目录指针基址), 而EPT paging-structure table(EPT页表结构)页表项使用的是HPA.
4. 设备的I/O访问
在由CPU发起访问外部设备(!!!)时, 需要通过PCI\PCIe总线的内存读写事务、I/O读写事务或配置读写事务进行. 当guest软件发起这样的访问, VMM可以通过内存虚拟化和I/O地址虚拟化达到虚拟化设备的目的.
当由设备主动发起访问内存(即DMA读写事务), 在DMA读写下CPU不参与, 也就不能为这个读写内存提供地址转换, VMM单纯依赖CPU来监控设备访问是比较难的.
于是, 基于PCI总线域(!!!)的虚拟化需要提供支持, VT-d就是为解决这个提出的. VT-d的其中一个重要功能就是进行DMA remapping(DMA重新映射), DMA remapping机制在芯片组或PCI设备(!!!)上实现地址转换(!!!)功能, 其原理和分页机制下的虚拟地址转换到物理地址是相似的.
DMA remapping需要识别设备的source-id, 这个source-id代表着发起DMA访问设备(即requester, 请求者)的身份, 实际上它就是PCI总线域的ID(!!!), 由bus、device和function组成. 根据source-id找到设备对应的页表(!!!)结构, 然后通过页表进行转换.
如图, 首先, 一个被称为Root-entry table(!!!)的结构需要在内存中构造(!!!), 由Root-entry指出Context-entry table(!!!), 再由context-entry得到页表结构(!!!), 最后经过页表得到最终的物理地址.
Root-entry table的基址被提供在MCH(Memory Control Hub!!!)部件, 一般位于Bus0、Device0、Function0设备(内存控制器!!!)扩展空间里的MEREMAPBAR寄存器(!!!), 在这个寄存器提供一个remap MMIO空间, 其中的RTADDR_REG寄存器(!!!)提供Root-entry table指针值, 但不同处理器, 这个remap MMIO空间的基址也存放在不同的位置.
DMA remapping提出了一个domain(域)的概念, 实际上就是为设备在内存中分配一个对应的区域. 例如, 为设备1分配domain 1, 为设备2分配domain 2, 它们访问各自独立的区域. 这个domain值可能被用作标记, 处理器使用它来标记内部的cache. 当然, 不同的设备也可以访问同一个domain, 但必须使用同一个domain值.