【问题标题】:How kvm guest access Virtual timer in ARMkvm guest如何访问ARM中的虚拟计时器
【发布时间】:2015-08-08 11:58:54
【问题描述】:

支持硬件虚拟化的 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()    

另外,从 guest 读取 Vtimer 计数不会产生任何陷阱,因为在代码流中找不到任何 vmexit 或 vmentry,对吧?

【问题讨论】:

  • As per the code,它只是读取它的虚拟计数out of CNTVCT,就像主机内核一样。除非您是指对“访问”的其他解释?
  • 好的,但是如果客户内核也从 CNTVCT 读取虚拟计数,那么客户如何使用仅在 Hypervisor KVM 中编程的 cntvoff 寄存器与主机同步时间?
  • 我不明白您所说的“与主机同步时间”是什么意思 - 虚拟化计数器的全部意义在于向客人隐藏主机时间,所以当他们的 vCPU 在其他东西运行后被重新调度时,他们看不到计数器值有大的跳跃。
  • 好的,我的意思是同步,无论在主机上看到什么时间,他们在主机上的时间都是相同的。假设主机在晚上 10 点开始,20 分钟后我们为客人做午餐,客人应该显示时间为晚上 10:20 与主持人相同?

标签: timer arm linux-device-driver kvm armv7


【解决方案1】:

我将答案分为两部分:

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

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

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

【讨论】:

  • 感谢 Arun 提供详细的答案,它帮助了我。我还有几个疑问。 1) 当 KVM Guest 试图获取其运行的时钟时,它会默认访问虚拟计时器吗? 2)当Guest访问Virtual timer时,它是否会捕获以及如何将中断从guest路由到host,然后从host路由到guest?
  • 1.是的,KVM 来宾直接访问虚拟计时器 2。没有陷阱发生。当 KVM 在 VM 中切换时,它也会在 OFFSET 寄存器中切换。 VTIMER_CNT = PTIMER_CNT+V_OFFSET。因此,KVM 间接控制了向操作系统显示的时间,从而避免了必须捕获和处理(效率低下)。如果发生定时器中断,则首先将其提供给 KVM。然后KVM通过对GIC的VCPU接口进行编程产生一个虚拟中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
相关资源
最近更新 更多