X86 MSI-X如何触发中断处理程序?是否需要轮询所选的内存地址?

X86 MSI-X如何触发中断处理程序?是否需要轮询所选的内存地址?,x86,interrupt,osdev,pci,apic,X86,Interrupt,Osdev,Pci,Apic,我有一个用UEFI引导的小内核。我正在使用QEMU进行虚拟化。我想写一个xHCI驱动程序来支持内核中的USB键盘。我很难找到简洁明了的信息。我在内核中“找到”了xHCI。我有一个指向其PCI配置空间的指针。它具有MSI-X功能。我想使用MSI-X,但我很难理解如何使用xHCI和USB 我的问题是,通常osdev.org是非常信息化的,并且有实现某些功能所需的基础。就MSI-X而言,情况似乎并非如此。我很难在osdev.org上的所有信息与MSI-X功能之间建立链接 基本上,我找到MSI-X表,然

我有一个用UEFI引导的小内核。我正在使用QEMU进行虚拟化。我想写一个xHCI驱动程序来支持内核中的USB键盘。我很难找到简洁明了的信息。我在内核中“找到”了xHCI。我有一个指向其PCI配置空间的指针。它具有MSI-X功能。我想使用MSI-X,但我很难理解如何使用xHCI和USB

我的问题是,通常osdev.org是非常信息化的,并且有实现某些功能所需的基础。就MSI-X而言,情况似乎并非如此。我很难在osdev.org上的所有信息与MSI-X功能之间建立链接

基本上,我找到MSI-X表,然后在那里设置一些地址,告诉xHCI PCI设备写入该地址以触发中断。但在某个时刻是否调用了中断处理程序?我是否需要轮询此地址以确定是否发生中断?我本以为MSI-X表中的矢量控制字段允许我设置一个中断矢量,但所有位都保留了

编辑

我发现以下问答部分回答了我的问题:

因此,基本上,数据寄存器的低位字节包含要触发的向量,消息地址寄存器包含要触发的LAPIC id。我还有一些问题

  • 为什么“消息地址寄存器包含0xFEE的固定顶部”

  • 消息地址寄存器中的RH、DM和XX位是什么

  • 这是如何与LAPIC一起工作的?基本上,它是如何在LAPIC中触发中断的。它是PCI设备的一个特殊功能,允许它们触发LAPIC中的中断。或者只是PCI设备向LAPIC的内存映射寄存器写入某些特定数据,从而触发中断。因为通常情况下,LAPIC是从核心内部访问的,每个LAPIC的地址都是相同的。这是来自CPU外部的某种处理器间中断吗

  • 为什么“消息地址寄存器包含0xFEE的固定顶部”
  • CPU类似于网络——数据包的标题描述了它们的内容,这些数据包围绕一组基于“地址”(类似于TCP/IP数据包中的IP地址)的链接进行路由

    MSI本质上是一个表示“将此数据写入该地址”的数据包,其中该地址对应于另一个设备(CPU内的本地APIC),并且是必需的,因为总线协议对该数据包/消息类型的要求是这样的,因为这告诉本地APIC它必须接受该数据包并进行干预。如果地址部分是错误的,那么它看起来就像其他任何写入操作一样(本地APIC不会接受它,也不会作为IRQ传递到CPU的核心)

    注意:理论上,对于大多数(英特尔)CPU,本地APIC的物理地址可以更改。实际上,没有任何合理的理由想要这样做,如果本地APIC的物理地址发生了变化,我认为标准/原始的“0xFEE…”地址范围仍然硬连接到本地APIC,以便MSI接受

  • 消息地址寄存器中的RH、DM和XX位是什么
  • 一个CPU上的软件(内核)使用本地APIC(以及其他用途)将IRQ/s发送到其他CPU;称为“处理器间中断”(IPI)。当MSI被发明时,它们只是重复使用IPI已经存在的相同标志。换句话说,DM(目标模式)和大多数其他位在英特尔手册中描述本地APIC的部分中定义。要正确理解这些位,您需要了解本地APIC和IPI;特别是关于IPI交付的部分

    后来(在引入硬件虚拟化时),Intel添加了一个“重定向提示”(允许将来自设备的IRQ重定向到特定的虚拟机)。这在名为“英特尔®虚拟化技术定向I/O体系结构规范”的规范(可在此处找到)中进行了描述

    甚至后来,Intel希望支持超过255个CPU的系统,但“APIC ID”是8位ID(将系统限制为最多255个CPU和一个IO APIC)。为了解决这个问题,他们创建了x2APIC(它改变了很多东西——32位APIC ID,MSR访问的本地APIC,而不是物理地址,…)。然而,所有的旧设备(包括IO APIC和MSI)都是为8位APIC ID设计的,因此为了解决这个问题,他们只是回收了他们已经拥有的相同的“IRQ重新映射”(来自虚拟化),以便具有8位APIC ID的IRQ可以重新映射到具有32位APIC ID的IRQ。结果是相对可怕和过分混乱(例如,想要支持大量CPU的内核需要使用IOMMU来处理与虚拟化无关的事情),但它可以在没有向后兼容性问题的情况下工作

  • 这是如何与lAPIC一起工作的?基本上,它是如何在lAPIC中触发中断的
  • 我希望(对于P6和更高版本-80486和奔腾使用了不同的“3线APIC总线”)它都使用相同的“数据包格式”(消息)-例如,IO APIC发送IPIs和MSI使用的相同的“将此数据写入此地址”数据包/消息(到本地APIC)

    这是来自CPU外部的某种处理器间中断吗


    是的!:-)

    我认为更常见的做法是将本地APIC拼写为LAPIC,大写字母L,以防字体看起来像大写字母I。正如您所怀疑的,更改本地APIC的地址不会影响MSI地址。MSI地址不仅在本地APIC中是硬连线的,在uncore的许多其他部分中也是硬连线的。