系统相关
首页 > 系统相关> > 【转载】Linux虚拟化KVM-Qemu分析(六)之中断虚拟化

【转载】Linux虚拟化KVM-Qemu分析(六)之中断虚拟化

作者:互联网

原文信息
作者:LoyenWang
出处:https://www.cnblogs.com/LoyenWang/
公众号:LoyenWang
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

背景

说明:

  1. KVM版本:5.9.1
  2. QEMU版本:5.0.0
  3. 工具:Source Insight 3.5, Visio
  4. 文章同步在博客园:https://www.cnblogs.com/LoyenWang/

1. 概述

本文会将ARM GICv2中断虚拟化的总体框架和流程讲清楚,这个曾经困扰我好几天的问题在被捋清的那一刻,让我有点每有会意,欣然忘食的感觉。

在讲述中断虚拟化之前,我们应该对中断的作用与处理流程有个大致的了解:

 
中断虚拟化,将从中断信号产生到路由到vCPU的角度来展开,包含以下三种情况:

  1. 物理设备产生中断信号,路由到vCPU;
  2. 虚拟外设产生中断信号,路由到vCPU;
  3. Guest OS中CPU之间产生中断信号(IPI中断);

本文将围绕ARM-GICv2来描述,因此也不会涉及到MSI以及ITS等特性,带着问题出发吧。

2. VGIC

 


再补充一个知识点:

  1. Host如果运行在EL1时,可以通过HVC(Hypervisor Call)指令,主动trap到EL2中,从而由Hypervisor来接管;
  2. Guest OS可以配置成当有中断或异常时trap到EL2中,在中断或异常产生时,trap到EL2中,从而由Hypervisor来接管;
  3. EL2可以通过eret指令,退回到EL1;

本文的讨论基于Non-VHE系统。

2.1 GIC虚拟化支持

GICv2硬件支持虚拟化,来一张旧图:

先看一下物理GIC的功能模块:

简化图如下:

GICv2,提供了硬件上的虚拟化支持,也就是虚拟GIC(VGIC),从而中断的接收不需要通过Hypervisor来软件模拟:

  1. 针对每个vCPU,VGIC引入了VGIC CPU Interfaces和对应的Hypervisor控制接口;
  2. 可以通过写Hypervisor控制接口中的LR(List Register)寄存器来产生虚拟中断,VGIC CPU Interface会将虚拟中断信号送入到Guest中;
  3. VGIC CPU Interface支持ACKEOI,因此这些操作也不需要trap到Hypervisor中来通过软件进行模拟,也减少了CPU接收中断的overhead;
  4. Distributor仍然需要trap到Hypervisor中来进行软件模拟,比如,当某个vCPU需要发送虚拟IPI到另一个vCPU时,此时是需要Distributor来辅助完成功能的,这个过程就需要trap到Hypervisor;

2.2 虚拟中断产生流程

本文开始提到的三种中断信号源,如下图所示:

 
上述描述的流程,实际中需要和虚拟外设去交互,包括虚拟外设框架(比如VFIO)等,而本文只是从中断的角度来分析,省去了外设部分。

 
理论部分讲完了,下边就开始从源码中去印证理论了。

3. 软件实现流程

3.1 VGIC初始化

3.2 物理外设产生中断

假设你已经看过之前CPU的虚拟化文章了,按照惯例,先上图:

 
那虚拟中断是什么时候注入的呢?没错,图中的kvm_vgic_flush_hwstate会将虚拟中断注入,并且在__guest_enter切换回Guest OS时进行响应:

3.3 虚拟外设产生中断

 
软件流程如下图:

3.4 vCPU IPI

 
软件流程如下:

 
耗时耗力耗心血的一篇文章终于写完了,ARMv8 GICv2中断虚拟化的总体框架和流程应该算是理顺了,全网相关主题的文章并不多,希望能给带来点帮助吧。

如果对你有用的话,在看,分享,打赏三连吧。

参考

《arm_gic_architecture_specification》
《ARM_Interrupt_Virtualization》
《VM-Support-ARM》
《CoreLink GIC-400 Generic Interrupt Controller》
《Virtualization in the ARM Architecture》
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=721eecbf4fe995ca94a9edec0c9843b1cc0eaaf3

欢迎关注个人公众号,不定期更新内核相关技术文章

标签:Guest,虚拟化,中断,Hypervisor,KVM,vgic,Linux,OS,CPU
来源: https://www.cnblogs.com/wsg1100/p/14908204.html