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


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

字段1 - BusDevFunc
字段2 - 供应商ID +设备ID
场3 - 中断线
第4栏 - BAR 0
然后BAR的其余部分寄存器(0 - 5)。

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


11964
2018-05-07 18:02


起源

在ServerFault上询问此问题 - Mitch Dempsey
我做到了 serverfault.com/questions/139670/...  这应该关闭吗? - vivekian2
你应该完全从serverfault.com删除你的双重问题;之后随时在这里标记这个问题,转移到serverfault。 (作为奖励,我在那里向你倾倒。 - 当您在服务器故障中移除q / a时,您将重新获得声誉。) - Robert Siemer
为什么要将问题转移到serverfault?这是一个编程问题。如果需要,我可以从serverfault中删除它或在此处指向此答案。但移动它是没有意义的。 - vivekian2
嗯,你知道它已经指向stackoverflow的答案。所以,我不知道你为什么做了一个downvote。随你。 - vivekian2


答案:


这是内核中的相应代码:

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个资源区域的标志相结合,然后是这些资源区域的长度,后跟已声明该设备的驱动程序的名称。


15
2018-05-08 06:10