如何解释/proc/bus/pci/devices的内容?

15

'cat /proc/bus/pci/devices'前几个字段是易于理解的。

第一字段 - BusDevFunc
第二字段 - 厂商ID+设备ID
第三字段 - 中断线
第四字段 - BAR 0
以及之后的所有BAR寄存器(0-5)。

在打印出BAR寄存器后,其他字段是什么?具体来说,哪些PCI配置空间寄存器(偏移量)被打印出来?


我看了http://serverfault.com/questions/139670/how-to-interpret-the-contents-of-proc-bus-pci-devices 这个问题,需要关闭吗? - vivekian2
你应该完全从serverfault.com上删除你的重复问题;之后,随意在此标记此问题以移动到serverfault。(作为激励,我在那里给你投了反对票。-当你在serverfault上删除你的q/a时,你会恢复声望。) - Robert Siemer
为什么您想要将这个问题移动到Serverfault上?这是一个编程问题。如果需要,我可以将其从Serverfault中删除或指向此处的答案。但将其移动毫无意义。 - vivekian2
你已经知道它指向stackoverflow的答案了。所以,我不知道你为什么要点个踩。无论如何。 - vivekian2
1个回答

20
这是内核中相应的代码:
static int show_device(struct seq_file *m, void *v)
{
    const struct pci_dev *dev = v;
    const struct pci_driver *drv;
    int i;

    if (dev == NULL)
        return 0;

    drv = pci_dev_driver(dev);
    seq_printf(m, "%02x%02x\t%04x%04x\t%x",
            dev->bus->number,
            dev->devfn,
            dev->vendor,
            dev->device,
            dev->irq);
    /* Here should be 7 and not PCI_NUM_RESOURCES as we need to preserve compatibility */
    for (i=0; i<7; i++) {
        resource_size_t start, end;
        pci_resource_to_user(dev, i, &dev->resource[i], &start, &end);
        seq_printf(m, "\t%16llx",
            (unsigned long long)(start |
            (dev->resource[i].flags & PCI_REGION_FLAG_MASK)));
    }
    for (i=0; i<7; i++) {
        resource_size_t start, end;
        pci_resource_to_user(dev, i, &dev->resource[i], &start, &end);
        seq_printf(m, "\t%16llx",
            dev->resource[i].start < dev->resource[i].end ?
            (unsigned long long)(end - start) + 1 : 0);
    }
    seq_putc(m, '\t');
    if (drv)
        seq_printf(m, "%s", drv->name);
    seq_putc(m, '\n');
    return 0;
}

在IRQ之后,似乎是将第一个6个资源区域的起始地址与标志组合起来,然后是这些资源区域的长度,最后是声称拥有该设备的驱动程序的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接