我知道linux下通过访问I/O端口来访问pci有两种途径;一:inl(),outl()函数.二:通过/dev/port. 第一种方法我已经搞定.问题出在第二种方法上.0 Y+ g6 \; d$ ?- D( G& b 我想把所有的pci设备都列出来,方法是把所有可能的pci地址放进端口0xcf8,从端口0xcfc读出配置空间地址00h的内容判断是否有效.8 X& k) n& a9 T$ p7 [( z8 V% n 可是我的程序一运行,系统就重启,我却找不到毛病在什么地方,希望懂的人可以帮个忙,先谢谢了!我的程序如下:* N+ e+ Z: J0 P/ o7 W" Z/ f void list_PCI_devices()8 R+ ]+ k# U% c! x {unsigned int bus,dev,fun;9 T n6 g8 k; F$ J% ` unsigned int bbus,bdev,bfun;0 ?5 e4 Q7 ^9 A: R! j unsigned int addr,data; unsigned int fp;* z' L( H; a/ x3 H printf("bus#\tdev#\tfun#\tvendor ID\tdevice ID\n");2 j- }9 v; C4 j' w; P2 G. h6 n for(bus=0;bus<=0xff;bus++) {, W j* t# x4 n& M( f: K/ `2 F. ~( x for(dev=0;dev<=0x1f;dev++)! w9 q! j5 W5 I8 j, ^" @' h {1 h& k2 N% J/ d% l2 X2 b" Y for(fun=0;fun<=0x7;fun++) {bbus=bus,bdev=dev,bfun=fun;0 F- q, r8 P) K z" C addr=0x80000000|bbus<<16|bdev<<11|bfun<<8;! Q0 `3 @0 F# Z( {1 I fp=open("/dev/port",O_RDWR); lseek(fp,0xcf8,SEEK_SET);9 J' K2 c. E6 z9 e& B write(fp,&addr,4); lseek(fp,0xcfc,SEEK_SET);. c# M* m0 O" j: K, R/ M read(fp,&data,4);) @" B( X# G& Z2 V' P close(fp);% `# m* S) M: H. `# o9 Q: O0 D9 w if(data!=0xffffffff && data!=0)/*identify vendor ID*/0 r! C/ x* ]. n( u( B% v" y { printf(" %02lX\t %02lX\t %02lX\t",bus,dev,fun);/ j7 I$ \% s. F s; U" z- C, f printf(" %X\t\t %04X\n",(short)data,data>>16);5 H- |! ?4 c# o# A" u# M: p& E }" m% c' r+ `7 ~% ` } } }( l9 E, O( x& w2 N/ _/ v; _; u- O } |
联系客服