2024年4月28日发(作者:)
PCI设备驱动
设备驱动 一
一、PCI简介
PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径
或信道。典型情况是,总线是连接于一个或多个导体的电气连线,总线上连接的所有设备
可在同一时间收到所有的传输内容。总线由电气接口和编程接口组成。本文讨论Linux 下
的设备驱动,所以,重点关注编程接口。
PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用
在桌面及更大型的计算机上的外设总线。PCI架构被设计为ISA标准的替代品,它有三个
主要目标:获得在计算机和外设之间传输数据时更好的性能;尽可能的平台无关;简化往
系统中添加和删除外设的工作。
二、PCI寻址
从现在开始,我想尽可能通过一些实际的例子来说明问题,而减少理论方面的问题的
描述,因为,相关的理论的东西,可以在其它地方找到。
我们先来看一个例子,我的电脑装有1G的RAM,1G以后的物理内存地址空间都是
外部设备IO在系统内存地址空间上的映射。/proc/iomem描述了系统中所有的设备I/O
在内存地址空间上的映射。我们来看地址从1G开始的第一个设备在/proc/iomem中是如
何描述的:
40000000-400003ff : 0000:00:1f.1
这是一个PCI设备,40000000-400003ff是它所映射的内存地址空间,占据了内存地
址空间的1024 bytes的位置,而0000:00:1f.1则是一个PCI外设的地址,它以冒号和逗号
分隔为4个部分,第一个16位表示域,第二个8位表示一个总线编号,第三个5位表示
一个设备号,最后是3位,表示功能号。
因为PCI规范允许单个系统拥有高达256个总线,所以总线编号是8位。但对于大型
系统而言,这是不够的,所以,引入了域的概念,每个PCI域可以拥有最多256个总线,
每个总线上可支持32个设备,所以设备号是5位,而每个设备上最多可有8种功能,所
以功能号是3位。由此,我们可以得出上述的PCI设备的地址是0号域0号总线上的31
号设备上的1号功能。那上述的这个PCI设备到底是什么呢?下面是我的电脑上的lspci
命令的输出:
00:00.0 Host bridge: Intel Corporation 82845 845 (Brookdale) Chipset Host
Bridge (rev 04)
00:01.0 PCI bridge: Intel Corporation 82845 845 (Brookdale) Chipset AGP
Bridge(rev 04)
00:1d.0 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #1) (rev 02)
00:1d.1 USB Controller: Intel Corporation 82801CA/CAM USB (Hub #2) (rev 02)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 42)
发布评论