专栏首页皮振伟的专栏[qemu][irq]KVM虚拟化的中断系统

[qemu][irq]KVM虚拟化的中断系统

1,中断类型 guest使用ubuntu 1604,在guest中执行cat /proc/interrupts

目前操作系统使用的中断有io apic,MSI,还有就是NMI,LOC等。 继续执行cat /proc/ioports | grep pic

实际上,主板上来连接这两颗pic设备,也就是两个i8259,分别是i8259 master和i8259 slave。对它们的访问使用pio(port io)即可。当guest访问8259的时候,vm会发生exit,虚拟的i8259响应guest的操作即可。 继续执行/proc/iomem | grep -i apic

apic设备的访问可以使用mmio(memory mapped io)的方式进行。同时,如果支持x2apic也可以使用msr访问apic。 那么中断设备的关系如下:

i8259每个pic可以产生8中irq,所以master产生的irq是从0-7,slave是8-15。 以i8042 kbd为例,在qemu-kvm的场景下,它会产生irq 1,所以它是由i8259 master产生的。 I8042 mouse,产生的irq是12,所以是i8259 slave产生的。 vda是virtio-blk,它是一个pci设备,它的中断是msi信号。 net0也是pci设备,中断也是msi信号。 2,irq routing 物理环境上,irq是由硬件产生的。在虚拟化下,却是由虚拟出来的。 kvm提供了set irq line这ioctl给user-mode调用,也提供了kvm_vm_ioctl_irq_line这样的函数在kernel-mode使用。 以键盘i8042 kbd为例,如果模拟一个键盘中断,即set irq 1.

虚拟触发了irq 1,那么需要经过irq routing: irq 1在0-7的范围内,所以会路由到i8259 master,随后i8259 master会向vCPU注入中断。 同时,irq 1也会路由到io apic一份,io apic也会向lapic继续delivery。lapic继续向vCPU注入中断。 linux在启动阶段,检查到io apic后,会选择使用io apic。尽管经过irq routing产生了i8259 master和io apic两个中断,但是Linux选择io apic上的中断。 同理,如果是virtio-blk产生了中断,则路由到msi处理。 3,apicv vcpu在setup阶段,如果支持apicv技术,将会配置EOI exit bitmap和posted interrupt等寄存器。在posted interrupt技术下,可以在不发生vm exit的情况注入中断,提高虚拟机的性能。 相关文档在intel的开发文档中《29.6 POSTED-INTERRUPT PROCESSING》中,对应的代码在linux-4.4/arch/x86/kvm/vmx.c中。 4,pv eoi 经过posted interrupt技术优化后,注入irq不发生vm exit。但是guest在应答irq的时候,还是要发生vm exit。 所以有了pv eoi技术: a,guest和host通过msr寄存器,协商出来一个地址,用作eoi使用。前提是host和guest都支持pv eoi。 b,guest的pa,和host的va,通过映射计算,就是在操作同一块内存。 那么就不用发生vm exit的情况下,达到guest和host内外通信的目的。同样原理的还有kvm clock、steal time等。 5,i8254 i8254就是irq 0的timer。在qemu-kvm中,可以通过用户态qemu实现,也可以通过内核态实现。默认使用内核态的实现。在host上执行ps,就可以看到[kvm-pit/1234]类似的进程,后面的数字是qemu进程的pid。kvm-pit线程是一个kthread worker线程,周期性的执行set irq 0,就可以在guest中周期性的发生中断。 Linux如果检测到LOC timer,就会选择停止i8254。停止i8254,kvm-pit停止周期性的注入中断,但是并不会退出。所以看到kvm-pit内核线程,但是它并不一定是在工作的。 如果在内核中加log,就会发现有趣的现象:在vm启动阶段,会有大量的注入中断的log;linux启动过程中,log就停止了。

本文分享自微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [linux][elf]ELF格式分析与常用工具以及不常见问题

    前言: ELF只linux是最常用的可执行文件格式,这里简单分析一下ELF格式,介绍几个常用命令,并分享几个不常见的问题。 分析: 1,dynamicall...

    皮振伟
  • ​[kvm][qemu]vm exit的优化

    前言: 减少vm exit的次数,提高虚拟机的性能。 本文对比几种场景,讨论kvm的性能优化方案。 本分方案中,host和guest都使用Linux4.4。相比...

    皮振伟
  • [linux][x86]LOCK指令的影响

    前言: 一般多线程并行操作,对个别的变量需要使用原子操作,经常用到__sync_fetch_and_add类似的函数,来避免CPU操作各自的cache没有同步内...

    皮振伟
  • 来自法国|航空遇见大数据

    大数据文摘
  • 建设城市大数据平台面临的挑战及建议

    日前,中国信息通信研究院正式发布《城市大数据平台白皮书》,阐述了城市大数据的概念和内涵,分析了建设城市大数据平台对于破解智慧城市建设难题的意义,并介绍了我国城市...

    数据猿
  • 全国多地病例0新增,教你用Python画出当下最火的疫情直观图

    点击下方视频,先睹为快:https://v.qq.com/x/page/i0933k361gl.html

    CDA数据分析师
  • Mysql中MyISAM引擎和InnoDB引擎的比较

    结论 如果不清楚自己应该用什么引擎,那么请选择InnoDB,Mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的引擎是MyISAM --...

    老七Linux
  • HDFS Router-based Federation

    Hadoop 社区为了解决 HDFS 横向扩展的问题,早前的版本中实现了基于 ViewFs 的 Federation 架构,而在最新的 Hadoop 版本中,社...

    Fayson
  • Linux内核第一宏

    list_entry()有着内核第一宏的美称,它被设计用来通过结构体成员的指针来返回结构体的指针。现在就让我们通过一步步的分析,来揭开它的神秘面纱,感受内核第一...

    Linux阅码场
  • Ionic3学习笔记(六)存储之使用 SQLite

    Theo Tsao

扫码关注云+社区

领取腾讯云代金券