X86 64 AMD-V中断虚拟化(AVIC):硬件支持和IOMMU交互

X86 64 AMD-V中断虚拟化(AVIC):硬件支持和IOMMU交互,x86-64,hypervisor,iommu,X86 64,Hypervisor,Iommu,我在AMD64体系结构编程手册(APM)第2卷中遇到过高级虚拟中断控制器(AVIC)。有些地方我不清楚,所以我很快浏览了流行的开源虚拟机监控程序(Qemu/KVM和Xen,仅举几例)源代码,看看它是如何与AMD IOMMU一起使用的。他们似乎都没有使用中航工业,而Bochs/Qemu也没有模拟它(Qemu中有IOMMU模拟,但它是针对没有虚拟化中断的修订版1) 因此出现了两个问题: 为什么中航工业如此“不受欢迎”?也许现在市场上的CPU并不广泛支持它,或者是因为所有这些虚拟机监控程序都有很长的历

我在AMD64体系结构编程手册(APM)第2卷中遇到过高级虚拟中断控制器(AVIC)。有些地方我不清楚,所以我很快浏览了流行的开源虚拟机监控程序(Qemu/KVM和Xen,仅举几例)源代码,看看它是如何与AMD IOMMU一起使用的。他们似乎都没有使用中航工业,而Bochs/Qemu也没有模拟它(Qemu中有IOMMU模拟,但它是针对没有虚拟化中断的修订版1)

因此出现了两个问题:

  • 为什么中航工业如此“不受欢迎”?也许现在市场上的CPU并不广泛支持它,或者是因为所有这些虚拟机监控程序都有很长的历史,并且已经自己虚拟化了中断,所以移植到中航工业并不是当务之急?(或者我只是在资料中遗漏了什么?)

  • [原始问题]IOMMU设备表条目中的来宾虚拟APIC表根指针是指向物理APIC ID表的指针吗,如APM第2卷第2节所定义。15.29.2.3


  • 感谢您的澄清。

    看起来中航工业即使在16h系列处理器中也不受支持(AMD系列00h-0Fh(卡比尼)处理器的初步BIOS和内核开发人员指南(BKDG)中说CPUID Fn8000_000A_EDX[AVIC]值为0)。这也可能是它没有在虚拟机监控程序中实现的原因

    第二个问题似乎是因为我使用了不同的APM和IOMMU规范修订版。当我得到兼容的版本(APM版本3.24和IOMMU规范版本2.6)时,IOMMU的数据结构似乎发生了重大变化。来宾虚拟APIC表根指针从DTE移动到IRTE,现在严格定义为指向虚拟APIC支持页的指针


    这确实是一种有用的机制,但遗憾的是,它还没有在硬件中得到支持。

    看起来中航工业甚至在16h系列处理器中也不受支持(AMD系列00h-0Fh(卡比尼)处理器的《初步BIOS和内核开发人员指南》(BKDG)中说CPUID Fn8000_000A_EDX[AVIC]值为0)。这也可能是它没有在虚拟机监控程序中实现的原因

    第二个问题似乎是因为我使用了不同的APM和IOMMU规范修订版。当我得到兼容的版本(APM版本3.24和IOMMU规范版本2.6)时,IOMMU的数据结构似乎发生了重大变化。来宾虚拟APIC表根指针从DTE移动到IRTE,现在严格定义为指向虚拟APIC支持页的指针


    这确实是一个有用的机制,可惜它还没有在硬件上得到支持。

    中航工业在2012年大张旗鼓地宣布了这一点(请参见和),但尚未在实际硬件上实现

    为旧硬件模拟x2APIC可提供合理的性能提升。Qemu现在甚至在Opteron gen 1上也在模仿x2APIC:中航工业最初设计时不提供x2APIC支持,所以这可能是它从未起飞的另一个原因。(请参见第二链接中的幻灯片2-4。)


    同时,在2012年,英特尔宣布了自己的实验性“APICv”,尽管它在推出时没有一个吸引人的名字。但英特尔的技术在2013年末出现了,基准测试也出现了:英特尔的APICv在常春藤桥EP系列()中以微码级实现,该系列以Xeon E5-26xx v2(2013年末推出)和Xeon E5-46xx v2(2014年初推出)两个品牌出售。

    中航工业在2012年大张旗鼓地宣布上市(见和)但尚未在实际硬件中实现

    为旧硬件模拟x2APIC可提供合理的性能提升。Qemu现在甚至在Opteron gen 1上也在模仿x2APIC:中航工业最初设计时不提供x2APIC支持,所以这可能是它从未起飞的另一个原因。(请参见第二链接中的幻灯片2-4。)


    同时,在2012年,英特尔宣布了自己的实验性“APICv”,尽管它在推出时没有一个吸引人的名字。但英特尔的技术似乎是真实的,基准出现在2013年末:英特尔的APICv在常春藤桥EP系列()中以微码级实现,该系列以Xeon E5-26xx v2(2013年末推出)和Xeon E5-46xx v2(2014年初推出)的品牌出售。

    至少在15h系列中支持60h-6Fh中航工业。很高兴认识你,谢谢。你有机会自己试一试吗?我在我的Ryzen 7上试一试,并且
    modprobe kvm_amd avic=1
    奏效了。我检查了
    cat/sys/modules/kvm\u amd/parameters/avic
    ,它显示
    1
    。测试了一个虚拟机,运行良好。默认情况下为
    0
    。至少在15h系列机型60h-6Fh中支持中航工业。很高兴认识你,谢谢。你有机会自己试一试吗?我在我的Ryzen 7上试一试,并且
    modprobe kvm_amd avic=1
    奏效了。我检查了
    cat/sys/modules/kvm\u amd/parameters/avic
    ,它显示
    1
    。测试了一个虚拟机,运行良好。默认情况下为
    0