我知道linux下通过访问I/O
端口来访问pci有两种途径;一:inl(),outl()函数.二:通过/dev/port.
第一种方法我已经搞定.问题出在第二种方法上.
我想把所有的pci设备都列出来,方法是把所有可能的pci地址放进端口0xcf8,从端口0xcfc读出配置空间地址00h的内容判断是否有效.
可是我的程序一运行,系统就重启,我却找不到毛病在什么地方,希望懂的人可以帮个忙,先谢谢了!我的程序如下:
void list_PCI_devices()
{unsigned int bus,dev,fun;
unsigned int bbus,bdev,bfun;
unsigned int addr,data;
unsigned int fp;
printf("bus#\tdev#\tfun#\tvendor ID\tdevice ID\n");
for(bus=0;bus<=0xff;bus++)
{
for(dev=0;dev<=0x1f;dev++)
{
for(fun=0;fun<=0x7;fun++)
{bbus=bus,bdev=dev,bfun=fun;
addr=0x80000000|bbus<<16|bdev<<11|bfun<<8;
fp=open("/dev/port",O_RDWR);
lseek(fp,0xcf8,SEEK_SET);
write(fp,&addr,4);
lseek(fp,0xcfc,SEEK_SET);
read(fp,&data,4);
close(fp);
if(data!=0xffffffff && data!=0)/*identify vendor ID*/
{
printf(" %02lX\t %02lX\t %02lX\t",bus,dev,fun);
printf(" %X\t\t %04X\n",(short)data,data>>16);
}
}
}
}
}