zoukankan      html  css  js  c++  java
  • PCI规范学习笔记(2)

    那天和一个朋友讨论了一下MSI/MSIX方面的问题,下面是对讨论内容的整理:

    1.MSI-X Table和PBA结构太大,MSIX Capability又只能放到配置空间64-255这个区域,所以只能把Table和PBA放到设备内存空间了。MSIX Capability存着BAR的编号和偏移量来从配置空间索引Table和PBA。

    2.
    MSI capability里“消息地址”字段在PCI规范里没有格式定义,这是因为PCI规范需要支持多种平台。在x86上和在SPARC上,消息地址的定义是不同的。

    3. x86上MSI”消息地址“(64或32位)在Intel 系统编程卷里定义,
    Solaris是用本地APIC的基地址0xfee00000按位或8位目标处理器ID再或1位RH(取值0),或1位DM(取值0),得到的地址就是设备发中断用的内存地址。

    4. x86上MSI“消息数据”(16位)的定义比较简单, Solaris使用边缘触发方式,投递模式是固定,最后低8位是中断向量地址。 关于“消息地址”和“消息数据”,Solaris请参考apic_pci_msi_enable_vector

    5. 需要注意的是,MSI“消息数据"的低3位是要根据MSI控制寄存器的Multiple Message Enable位来由设备动态修改的,所以一个”消息数据“寄存器可以被最多32个向量共用。

    6. MSI capability里支持最多32个向量,但由于这32个向量共享一个“消息地址”。而在x86上,这个"消息地址"用来决定发送到哪一个CPU的本地APIC,所以32个向量只能绑定在同一个CPU了。

    7. MSIX capability指向了Table和PBA表在哪一个BAR对应的内存空间里。Table里包含了“消息地址”和”消息数据“, x86下格式和MSI的完全一样。PBA指示了是否有待处理的中断消息。

    8.
    一 个设备理论上最多分配32个MSI中断, 向量数大于1时,需要分配连续相邻的向量,这是MSI capability里”消息数据“和”Multiple Message Enable“的定义决定的。Solaris可参考apic_alloc_msi_vectors的实现。

    9.
    一个设备理论上最多可以分配2K个MSIX中断, 而且每个中断向量可以是不连续的, 因为Table的大小是11位二进制表示的, 其中每个表项都有独立的”消息地址“和“消息数据”。Solaris可参考apic_alloc_msix_vectors。

    10. 因为每个向量对应独立的“消息地址”和“消息数据”, MSIX可以让一个设备多至2K个中断独立的绑定在不同的CPU上,CPU足够多的时候它们互相不影响,所以Intel的SRIOV 1/10G卡的VF都只支持MSIX而不是MSI。

  • 相关阅读:
    找控件的父类
    silverlight和wpf中暴露 给子类override
    Oracle PLSQL 记录
    C#之TopShelf启动Windows服务 原文链接:https://blog.csdn.net/qq_36664495/java/article/details/90600995
    Super socket 记录知识
    oracle 查找字符位置 开始按照长度截取
    转 acl 库是啥、主要包含哪些功
    转自 posted on 2015-05-18 11:50 LitDev https://www.cnblogs.com/New-world/p/4511543.html
    dtu server 编译错误
    iOS 杂笔-22(万年一遇~一张图片对代理的理解)
  • 原文地址:https://www.cnblogs.com/ainima/p/6330795.html
Copyright © 2011-2022 走看看