购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1.3 中断虚拟化

前面提到,vCPU不仅要能高效地执行所有指令,还要能正确处理系统中出现的中断和异常事件。大部分异常(如除零错误、非法指令等)无须虚拟化,直接交给虚拟机操作系统处理即可。而对于部分需要虚拟化的异常,则需要陷入Hypervisor中进行相应的处理,没有固定的解决方案,第3章内存虚拟化将会介绍Hypervisor如何处理虚拟机缺页异常。本节主要关注中断虚拟化的相关内容。

中断是外部设备请求操作系统服务的一种方式,通常由外部设备发起,经由中断控制器发送给CPU。以磁盘为例,在物理环境下,操作系统发起一个读磁盘请求,磁盘将操作系统请求的数据放置在指定位置后给中断控制器发送一个中断请求,中断控制器接收后设置好内部相应寄存器,CPU每次执行指令前都会检查中断控制器中是否存在未处理的中断,若有则调用相应的ISR(Interrupt Service Routine,中断服务例程)进行处理。而在虚拟环境下,可能存在多个虚拟机同时运行的情况,它们通过虚拟设备共用物理磁盘(详见第4章I/O虚拟化),此时若磁盘产生一个物理中断,该中断应该交给哪一个虚拟机的操作系统处理呢?即如何将该中断注入发起读磁盘操作的虚拟机中,使该虚拟机操作系统执行相应的ISR。

在虚拟化环境下,设备与中断控制器均由Hypervisor模拟,相应寄存器的状态对应于内存中某些数据结构的值。当虚拟机执行I/O指令时,会陷入Hypervisor中进行处理,Hypervisor调用相应的设备驱动完成I/O操作。在上述过程中,Hypervisor不仅知道发起I/O操作的虚拟机的详细信息,还能通过设置虚拟设备和虚拟中断控制器的寄存器状态从而完成中断注入。因此一个理想的方案是将该物理中断交给Hypervisor处理,再由Hypervisor设置虚拟中断控制器,注入一个虚拟中断到虚拟机中。仍以读磁盘为例,虚拟机发起一个读磁盘请求(见图2-3中标号①)触发虚拟机下陷进入Hypervisor进行处理(见图2-3中标号②),Hypervisor向物理磁盘发起读磁盘请求(见图2-3中标号③),物理磁盘完成数据读请求后产生一个中断并递交给物理中断控制器(见图2-3中标号④),Hypervisor执行相应的中断服务例程完成数据读取(见图2-3中标号⑤),并设置虚拟磁盘和虚拟中断控制器相应寄存器的状态(见图2-3中标号⑥),而后Hypervisor恢复虚拟机运行(见图2-3中标号⑦),虚拟机发现有待处理的中断,调用相应的中断服务例程(见图2-3中标号⑧)。上述流程对硬件有如下要求:①物理中断将会触发虚拟机下陷进入Hypervisor中处理;②虚拟机恢复运行时要先检查虚拟中断控制器是否有待处理中断。后续章节将以Intel VT-x为例说明虚拟化硬件如何完成这两点要求。

图2-3 虚拟中断注入流程
注:①向虚拟磁盘发起读请求;②虚拟机下陷;③Hypervisor向物理磁盘发起读请求;④向中断控制器提交中断;⑤执行中断服务例程;⑥Hypervisor设置虚拟磁盘与虚拟中断控制器;⑦恢复虚拟机执行;⑧虚拟机执行中断服务例程。

通过虚拟机下陷将物理中断转换为虚拟中断解决了多虚拟机系统中物理中断的路由问题,但是对于直通设备却很不友好。直通设备(详见第4章I/O虚拟化)是指通过硬件支持将一个物理设备直通给某个虚拟机使用,该设备由这个虚拟机独占,故该设备产生的中断也应当由这个虚拟机处理,无须经过Hypervisor路由。为了解决这个问题,ELI(Exitless Interrupt,不退出中断) [12] 引入了Shadow IDT(Shadow Interrupt Descriptor Table,影子中断描述符表),区分直通设备产生的中断与其他物理中断,直通设备产生的中断直接递交给虚拟机处理,无须Hypervisor介入。DID(Direct Interrupt Delivery,直接中断交付) [13] 则进一步通过将虚拟设备产生的中断转换为物理IPI(Inter-Processor Interrupt,处理器间中断)直接递交给虚拟机进行处理。相较于上述软件方案,硬件厂商提供了新的硬件机制,直接将中断注入正在运行的虚拟机且不会引发虚拟机下陷,如Intel公司的发布-中断(Posted-Interrupt)机制和ARM公司的ITS(Interrupt Translation Service,中断翻译服务)机制。Directvisor [14] 便使用Posted-Interrupt机制将直通设备产生的中断注入虚拟机中。“多虚一”环境下的中断虚拟化则更为复杂,节点A上I/O设备产生的中断可能需要注入节点B上运行的vCPU中。为了解决上述问题,GiantVM在每一个物理节点上都创建一个虚拟中断控制器,并选定一个节点作为主节点,其他节点上的虚拟中断控制器接收到中断信号时,会将该信号转发给主节点上的虚拟中断控制器,设置相应寄存器的值,而后由主节点虚拟中断控制器决定将该中断注入哪个vCPU中。 fDnMLwNQ7pEcX95mp7mf1yeE8Y0beFW/UCDpwYZ062bWrCuTDQwXoP0iLhhxFpD8

点击中间区域
呼出菜单
上一章
目录
下一章
×