目录

前言

pci简介

后记

前言

最近楼主比较苦逼啊,主管布置了一道访问pci的作业,这个作业使用io方式还可以非常浪地将所有的东西都给读取出来,虽然不能读取出pci-e设备的所有信息,但是还是可以将256位的其他东西给读出来的。

本文将先从io访问模式进行对pci访问的设置,在这里我所使用的包含了dos和Linux,这样可以看到这2个的系统代码的不同。

pci简介

PCI总线是一种高性能32位或者64位的多路复用地址或者数据行的总线。相当于现实生活中的公路,是所谓的信号通道。可以在这上面传输数据、控制信号等等。

作用:高度集成外围控制其、外围插件和处理器/内存系统之间的互连机制。

如果要访问PCI 设备,首先要确定PCI设备在系统中的物理连接情况。描述这个连接情况的数据是“总线号”、“设备号”和“功能号”。一个系统可以有256个PCI总线,每个总线上可以有32个设备,每个设备可以具有8个功能(每个功能作为一个PCI设备)。当这三个数据确定的时候,就可以在系统中唯一确定一个PCI 设备。

8~10:功能位. 有时候,一个pci设备对应多个功能.将每个功能单元分离出来,对应一个独立的pci device

11~15位:设备号 对应该pci总线上的设备序号

16~23位:总线号 根总线的总线号为0.每遍历到下层总线,总线号+1

PCI拓扑结构图

在上图的总线结构中,ethernet设备和pci-pci bridge的同类型资源空间必须要是pci bus0的一个子集

例如,pci bus 0的I/O端口资源是0x00CC~0x01CC. Ethernet设备的I/O范围的是0x00CC~0x0xE0.那么pci-pci bridge的I/O端口范围就必须要在0x0xE0~0x01CC之间.

同样,SCSI和VIDEO同类型资源必须要是pci_bus1的子集.pci bus1上有一个pci桥,对应的资源也就是它所连桥上的资源.即pci_bus->self.也就是说,下层总线的资源是它上层总线资源的子集。上层总线资源是下层总线资源的父集。

其实,每个PCI设备的资源地始地址都是由操作系统设置的.在x86上,都由bios设置好了.

pci配置空间

PCI配置空间是一块容量为256字节并具有特定记录结构或模型的地址空间,通过配置空间,我们可以了解该PCI设备的一些配置情况,进而控制该设备,除主总线桥以外的所有PCI设备都必须事先配置空间.

配置空间的前64个字节叫头标区,头标区又分成两个部分,第一部分为前16个字节,在各种类型的设备中定义都是一样的,其他字节随各设备支持的功能不同而有所不同,位于偏移0EH的投标类型字段规定了是何种布局,目前有三种头标类型,头标类型1用于PCI-PCI桥,头标类型2用于PCI-CARDBUS桥,头标类型0用于其他PCI设备,下图为头标类型0的头标区布局。

头标区中有5个字段涉及设备的识别。

供应商识别字段(Vendor ID)

偏移:00H。该字段用以标明设备的制造者。一个有效的供应商标识由PCI SIG来分配,以保证它的唯一性。0FFFFH是该字段的无效值。

设备识别字段(Device ID)

偏移:02H。用以标明特定的设备,具体代码由供应商来分配。

版本识别字段(Revision ID)

偏移:08H。用来指定一个设备特有的版本识别代码,其值由供应商提供,可以是0。

头标类型字段(Header Type)

偏移:0EH。该字段有两个作用,一是用来表示配置空间头标区第二部分的布局类型;二是用以指定设备是否包含多功能。位7用来标识一个多功能设备,位7为0表明是单功能设备,位7为1表明是多功能设备。位0-位6表明头标区类型。

分类代码字段(Class Code)

偏移:09H。标识设备的总体功能和特定的寄存器级编程接口。该字节分三部分,每部分占一个字节,第一部分是基本分类代码,位于偏移0BH,第二部分叫子分类代码,位于偏移0AH处,第三部分用于标识一个特定的寄存器级编程接口。

io口访问pci设备

在dos下申请相关的接口就可以得到io口,通过cf8和cfc的模式进行读取遍历pci设备。

#include

typedef unsigned long DWORD;

typedef unsigned int WORD;

#define MK_PDI(bus,dev,func) (WORD)((bus<<8)|(dev<<3)|(func))

#define MK_PCIaddr(bus,dev,func) (DWORD)(0xf8000000L|(DWORD)MK_PDI(bus,dev,func)<<8)

#define PCI_CONFIG_ADDRESS 0xCF8

#define PCI_CONFIG_DATA 0xCFC

DWORD inpd(int inport)

{

DWORD data;

asm mov dx,inport;

asm lea bx,data;

__emit__(

0x66,0x50,

0x66,0xED,

0x66,0x89,0x07,

0x66,0x58);

return data;

}

void outpd(int outport,DWORD addr)

{

asm mov dx,outport;

asm lea bx,addr;

__emit__(

0x66,0x50,

0x66,0x8B,0x07,

0x66,0xEF,

0x66,0x58);

}

DWORD GetData(DWORD addr)

{

DWORD data;

outpd(PCI_CONFIG_ADDRESS,addr);

data = inpd(PCI_CONFIG_DATA);

return data;

}

int main()

{

int bus,dev,func;

DWORD addr,addr1,addr2,addr3;

DWORD data,data1,data2,data3;

printf("Bus#\tDev#\tFunc#");

printf("\n");

for (bus = 0; bus <= 0x63; ++bus)

{

for (dev = 0; dev <= 0x1F; ++dev)

{

for (func = 0; func <= 0x7; ++func)

{

addr = MK_PCIaddr(bus,dev,func);

data = GetData(addr);

if((WORD)data!=0xFFFF)

{

printf("%2.2x\t%2.2x\t%2.2x\t",bus,dev,func);

printf("\n");

}

}

}

}

return 0;

}

在Linux系统下就很简单了,直接看代码吧!

#include

#include

#include

#include

#define PCI_MAX_BUS 255

#define PCI_MAX_DEV 31

#define PCI_MAX_FUN 7

#define PCI_BASE_ADDR 0x80000000L

#define CONFIG_ADDR 0xcf8

#define CONFIG_DATA 0xcfc

typedef unsigned long DWORD;

typedef unsigned int WORD;

typedef unsigned long DWORD;

int main()

{

WORD bus,dev,fun;

DWORD addr,data;

int ret;

printf("bus#\tdev#\tfun#\t");

printf("\n");

ret = iopl(3);

if(ret < 0)

{

perror("iopl set error");

return -1;

}

for(bus = 0; bus <= PCI_MAX_BUS; bus++)

for(dev = 0; dev <= PCI_MAX_DEV; dev++)

for(fun = 0; fun <= PCI_MAX_FUN; fun++)

{

addr = PCI_BASE_ADDR|(bus << 16)|(dev << 11)|(fun << 8);

outl(addr,CONFIG_ADDR);

data = inl(CONFIG_DATA);

if((data != 0xffffffff)&&(data != 0))

{

printf("%2x\t%2x\t%2x",bus,dev,fun);

printf("\n");

}

}

ret = iopl(0);

if(ret < 0){

perror("iopl set error");

return -1;

}

return 0;

}

c语言获取PCI信息,C语言-遍历pci设备相关推荐

  1. 在linux环境获取pcie卡信息,如何Linux下得到CPU、内存及PCI信息

    很多时候我们需要得到linux下面的硬件信息, 那么如何得到呢? 其实linux给出了多种途径 我们看一下每一个命令,以便得到最详细的信息 /* 二,硬件的查看 1,lspci 2,dmidecode ...

  2. PCI相关(2)- PCI桥与配置

    一.存储域和总线域 在PCI 体系结构中,含有两类桥片,一个是 HOST 主桥,另一个是 PCI 桥.在每一个 PCI设备中(包括 PCI 桥)都含有一个配置空间.这个配置空间由 HOST 主桥管理, ...

  3. 设置 Visual Studio 文件版权信息 - C语言零基础入门教程

    目录 一.手动修改原始代码模板 二.通过插件 Visual Assist 设置版权信息 1.安装插件 Visual Assist 2.打开 VS,找到 VAssistX 选项 3.设置模板内容 4.点 ...

  4. c语言遍历字节,C语言遍历结构体

    假设结构体为: typedef struct { unsigned char ucType; char cProgramID[32]; char cRegionGroupID[32]; unsigne ...

  5. C语言获取硬件信息(CPU序列号,硬盘序列号,网卡IP、MAC地址、是否插入网线)

    目录 一.前言 二.代码实现 2.1 获取CPU序列号 2.2 获取硬盘序列号 2.3 获取网卡信息 附:源代码下载 一.前言   本文主要介绍Linux和Windows下使用C语言获取各种硬件信息, ...

  6. pci总线协议学习笔记——PCI总线基本概念

    1.pci总线概述 (1)PCI,外设组件互连标准(Peripheral Component Interconnection),是一种由英特尔(Intel)公司1991年推出的用于定义局部总线的标准; ...

  7. 更新Linux维护的PCI硬件数据库,Bus options (PCI etc.)总线选项 - Linux-4.4-x86_64 内核配置选项...

    Support mmconfig PCI config space access CONFIG_PCI_MMCONFIG 允许通过mmconfig方式访问PCI config space,这种访问方式 ...

  8. Linux系统C语言遍历系统文件系统,并查询其磁盘使用率(有效磁盘)

    getmntent_r接口示例程序地址:https://github.com/Rtoax/test/tree/master/c/glibc/mntent statfs 接口示例程序地址​​​​​​​: ...

  9. lin卡pci linux驱动下载,万能PCI串口卡驱动

    万能PCI串口卡驱动官方版 万能PCI串口卡驱动官方版是款比较专业的pci串口卡通用驱动.万能PCI串口卡驱动支持大部分的pci串口卡.万能PCI串口卡驱动还可适用于win7.xp.linux系统,可 ...

最新文章

  1. symfony 2 app.php,php / symfony2从URL隐藏app.php
  2. LeetCode 1242. Web Crawler Multithreaded--Java 解法--网路爬虫并发系列--ConcurrentHashMap/Collections.synchroni
  3. 深入研究Java类加载机制
  4. 无影云电脑居家办公最佳实践(AD域账号)
  5. Vant Weapp小程序蹲坑之事件名称问题及解决方案
  6. eclips断点调试
  7. word保存不了磁盘已满_【Word技巧】word使用终极技巧,工程人必会(二)
  8. 2021云上智能白皮书 附下载
  9. 合宙Air724UG二次开发(2):资料描述
  10. 如何免费下载和翻译论文
  11. php上传头像的代码,关于微信小程序中上传头像的代码
  12. LayaAir引擎78款3D射击主题微信小游戏分享,看看玩过几款!
  13. 生成的分子图像是否可以识别为SMILES,然后再将识别后的SMILES转换为图像?
  14. UVM 中的消息机制
  15. numpy 归一化 与 标准化
  16. PWM/转速单闭环/转速电流双闭环电机控制Simulink仿真
  17. 愚人节巧用CSS开个极客式玩笑以chrome为例
  18. raid卡缓存对硬盘性能_告诉你NAS究竟用不用RAID?万兆网络下NAS读取写入实测分...
  19. 一些网站...........
  20. Privacy Amplification by Decentralization

热门文章

  1. 给出一个大于或等于3的正整数,判断它是不是一个素数
  2. 定做加工菠萝格凉亭材料需要哪些工序
  3. hashcat解密握手包
  4. EA以7.5亿美元收购植物大战僵尸开发商PopCap
  5. 操作系统原理_田丽华(1)操作系统概述
  6. 训练神经网络的详细步骤,提高神经网络训练速度
  7. vue图片文件太大无法上传
  8. php请求找不到tpl文件
  9. 关于最简单的敲竹杠病毒的密码破解
  10. 这款不输5118伪原创文章生成器软件