徐州网站建设模板,增加wordpress打开速度,汽车配件加工网,网站五合一建设今天来看看虚拟中断。
在一个非虚拟化的系统中#xff0c;操作系统可以直接访问GIC的寄存器#xff0c;并且处理GIC的物理中断接口#xff08;physical interrupt interface#xff09;。
但是在一个虚拟化的系统中#xff0c;不是这样。Guest OS并不知道它运行在虚拟系…今天来看看虚拟中断。
在一个非虚拟化的系统中操作系统可以直接访问GIC的寄存器并且处理GIC的物理中断接口physical interrupt interface。
但是在一个虚拟化的系统中不是这样。Guest OS并不知道它运行在虚拟系统中其接收的中断来自GIC的虚拟中断接口virtual interrupt interface但是OS本身并不知道实际上是hypervisor接管了GIC的寄存器访问和物理中断接口且hypervisor要负责产生虚拟中断给Guest OS。 还有另外一种方式产生虚拟中断就是通过配置HCR_EL2由内部CPU核产生。在HCR_EL2里面有三个bit用来产生虚拟中断
VI设置该bit产生一个vIRQVF设置该bit产生一个vFIQVSE设置该bit产生一个vSerror
设置这些bit位就相当于中断控制器向vCPU发送中断信号。生成的虚拟中断受PSTATE掩蔽的影响就像常规中断一样。这种机制使用起来很简单但缺点是hypervisor需要模拟中断控制器的操作。换言之软件中的trap和emulate操作的开销比较大影响性能。
通过GIC就能避免上面的问题。GIC的物理CPU接口和虚拟CPU接口是等同的区别只是一个发送物理中断信号另一个发送虚拟中断信号。 来看一个例子 外部中断到达GICGIC产生一个物理IRQ给CPUCPU转换到EL2hypervisor通过物理CPU接口读取中断Hypervisor写GIC的List寄存器产生虚拟中断GIC通过vIRQ发送中断给CPUCPU从EL2返回到EL1或者EL0Guest OS读取中断CPU执行中断处理程序。
在GICv4中增加了对虚拟机直接注入虚拟中断的支持。支持GICv4的IP是GIC-700.目前的虚拟中断直接注入支持产生LPI也就是说系统中要有ITS组件。 Hypervisor会事先通过ITS命令配置ITS重新映射虚拟core和物理core虚拟中断和物理中断。当ITS接到消息中断后先要查表得到虚拟的INTID和虚拟PE然后发给相应的redistributor。Redistributor会去检查内部的寄存器查看vPE是否在自己这边注册过。如果注册过发虚拟中断给vPE如果没有发中断给hypervisor。
GIC-700也支持软件通过将vPE和SGI-INTID写入GITS_SGIR寄存器的方式来直接注入SGI。对于PPI和SPI的直接注入目前尚不支持。 作者老秦谈芯