最近在Solaris上成功编译了pciutils,想试试的朋友可以从下面的地址下载:
一直觉得PCI很神秘,看看了pciutils的代码和PCI Local Bus Specification后,对PCI稍微有了点了解,我觉得pciutils有两个关键的函数,一个conf1_read,另外一个是conf1_write。这两个函数完全是根据PCI Local Bus Specification下面这一节编写的:
3.2.2.3.2. Software Generation of Configuration Transactions
conf1_read(struct pci_dev *d, int pos, byte *buf, int len)
{
...
outl(0x80000000 | ((d->bus & 0xff) << 16) | (PCI_DEVFN(d->dev, d->func) << 8) | (pos&~3), 0xcf8);
...
}
bit31: enable
bit16-bit23: Bus Number
bit11-bit15: Device Number
bit8-bit10: Function Number
bit2-bit7: Register Number
将这些位在I/O Port 0xcf8设定好之后,就可以从I/O port 0xcfc读出相应的值了。
当然进行这些操作之前需要改变I/O privilege level
SunOS: sysi86(SI86V86, V86SC_IOPL, PS_IOPL)
Linux: iopl(3)