| 我知道linux下通過(guò)訪(fǎng)問(wèn)I/O端口來(lái)訪(fǎng)問(wèn)pci有兩種途徑;一:inl(),outl()函數.二:通過(guò)/dev/port. 第一種方法我已經(jīng)搞定.問(wèn)題出在第二種方法上.0 Y+ g6 \; d$ ?- D( G& b 我想把所有的pci設備都列出來(lái),方法是把所有可能的pci地址放進(jìn)端口0xcf8,從端口0xcfc讀出配置空間地址00h的內容判斷是否有效.8 X& k) n& a9 T$ p7 [( z8 V% n 可是我的程序一運行,系統就重啟,我卻找不到毛病在什么地方,希望懂的人可以幫個(gè)忙,先謝謝了!我的程序如下:* 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 } |
聯(lián)系客服