请帮忙看下这段程序,具体的解释下
这是一个用C语言写的遍历PCI设备的程序printf("\nNo. Vendor/Device Bus No. Dev No. Func No. Class");
i = 0;
for (busNo = 0; busNo < 5; busNo++) { // bus No
for(deviceNo = 0; deviceNo < 32; deviceNo++) { // device no
for (funcNo = 0; funcNo < 8; funcNo++) { // Function No
//j = 0x80000000 + i * 2048;
regVal = 0x80000000 // bit31 使能
+ (busNo << 16) // Bus No
+ (deviceNo << 11) // Device No
+ (funcNo << 8); // Function No
outportl(0xCF8, regVal);
retVal = inportl(0xCFC); // 得到配置空间偏移为0的双字
if (retVal != 0xffffffff) { // 设备存在
i++;
vendorID = retVal & 0xffff; // 得到供应商代码
devID = (retVal >> 16) & 0xffff; // 得到设备代码
regVal += 0x08; // 得到配置空间偏移为08H的双字
outportl(0xCF8, regVal);
retVal = inportl(0xCFC);
retVal = retVal >> 8; // 滤掉版本号
class3 = retVal & 0x0FF; // 得到三个分类代码
class2 = (retVal >> 8) &0x0FF;
class1 = (retVal >> 8) &0x0FF;
printf("\n%02d %04x/%04x %02x %02x %02x %02x-%02x-%02x",
i, vendorID, devID, busNo, deviceNo, funcNo, class1, class2, class3);
if (funcNo == 0) { // 如果是单功能设备,则不再查funcNo>0的设备
regVal = (regVal & 0xFFFFFFF0) + 0x0C;
outportl(0xCF8, regVal);
retVal = inportl(0xCFC);
retVal = retVal >> 16;
if ((retVal & 0x80) == 0) funcNo = 8;
}
}
}
}
}