kvm guest如何访问ARM中的Virtual timer

How kvm guest access Virtual timer in ARM

具有硬件虚拟化支持的 ARMv7 架构还包括对定时器和中断控制器的虚拟化支持。

我想知道来宾如何在这个虚拟化环境中访问虚拟计时器?

当来宾尝试访问虚拟计时器时,它(来宾 KVM)是否会向 vgic 代码注入虚拟中断(kvm_vgic_inject_irq)?

任何人都可以提供有关 ARM 中的访客访问虚拟计时器的详细信息吗?

编辑

我试图从来宾访问虚拟计时器的角度来理解源流。据我了解

当 KVM Guest 试图访问(读取 VTimer tick/count)时,它会通过 ach_timer.c

向 vgic 代码注入虚拟中断
                    kvm_timer_inject_irq()
                             |
                             |
                     kvm_vgic_inject_irq()
                             |                                 
                             |
                       kvm_vcpu_kick()  
                             | 
                             | 
                       timer_handler()
                             |
                             |
                      arch_timer_reg_read()
                             |
                             |
                    arch_timer_reg_read_cp15()    

此外,从来宾读取 Vtimer 计数不会生成任何陷阱,因为在代码流中找不到任何 vmexit 或 vmentry,对吗?

我把答案分为两部分:

1.访问虚拟定时器寄存器: 来宾 OS 将访问虚拟计时器。 KVM 将为系统中的每个 VM 在 VM 上下文中保留一份虚拟定时器寄存器的副本。此(计时器)上下文将在 VM 切换期间切换 IN/OUT。除此之外,主机内核可以使用定时器偏移寄存器来调整虚拟定时器的计数器。 (进行调整以解决其他来宾 VM 执行时丢失的滴答声)。这两种机制允许 KVM 在 VM 之间切换并虚拟化定时器寄存器。

2。虚拟定时器中断路由 系统中的所有中断都通过 KVM 路由。 KVM 根据中断号(和其他参数)决定哪个来宾应该获得中断。一旦决定传递中断,KVM 将要求 VGIC 的 VCPU 接口为特定 VM 触发中断。本质上,虚拟定时器中断就像系统中的任何其他中断一样被路由到 Guest VM

您在问题中粘贴的调用跟踪显示了通常如何处理中断。 'timer_handler' 被调用,因为在这个特定的实例中触发了定时器中断,跟踪的上半部分对于任何中断都将保持几乎相同。