PCIe具体解释分析
参考文章
PCIe总线详解_STATEABC-GitCode 开源社区
https://zhuanlan.zhihu.com/p/652808759
PCI总线学习(一):PCI总线结构-CSDN博客
PCI——第1章——PCI总线的基本知识-CSDN博客
计算机中register、cache、memory的区别 - Line's Blog
什么是内存管理单元(MMU)
LSPCI具体解释分析 - yxwkaifa - 博客园
上面这个文章,写的很有力度,所以作如下笔记,
一、PCI简单介绍
PCI是一种外设总线规范。我们先来看一下什么是总线:总线是一种传输信号的路径或信道。典型情况是,总线是连接于一个或多个导体的电气连线,总 线上连接的全部设备可在同一时间收到全部的传输内容。总线由电气接口和编程接口组成。本文讨论Linux 下的设备驱动,所以,重点关注编程接口。
PCI是Peripheral Component Interconnect(外围设备互联)的简称,是普遍使用在桌面及更大型的计算机上的外 设总线。PCI架构被设计为ISA标准的替代品,它有三个主要目标:获得在计算机和外设之间数据传输时更好的性能;尽可能的平台无关;简化往系统中加入和 删除外设的工作。
二、PCI寻址
从如今開始,我想尽可能通过一些实际的样例来说明问题,而降低理论方面的问题的描写叙述,由于,相关的理论的东西,能够在其他地方找到。
我们先来看一个样例,我的电脑装有1G的RAM,1G以后的物理内存地址空间都是外部设备IO在系统内存地址空间上的映射。
此处的RAM代表,
1 SRAM--静态随机存储器。
位于CPU内部的cache(缓存)一般使用SRAM。
2 DRAM--动态随即存储器。
外置的memory(内存),一般使用的DRAM。缓存,内存,CPU关系如下,
/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位(指的是0000)表示域(上面的一串数字其实是十六进制数字,每个十六进制数字占4位二进制数位,原文说“第一个16位”),第二个8位(00 :这两个十六进制数字,占8位二进制数数位)表示一个总线编号,第三个5位(指的是1f。5位二进制数字,最大能表示31这个十进制数字)表示一 个设备号,最后是3位(指的是1),表示功能号。
由于PCI规范同意单个系统拥有高达256个总线,所以总线编号是8位(在上面那串数字中0000:00:0f.1 ,00这两个十六进制位数字,即8个二进制位)。但对于大型系统而言,这是不够的,所以,引入了域的概念,每一个 PCI域能够拥有最多256个总线(在上面那串数字中0000:00:0f.1 ,0000这四个十六进制位数字,即共16个二进制位,十六个二进制位代表十进制255),每一个总线上可支持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)00:1f.0 ISA bridge: Intel Corporation 82801CAM ISA Bridge (LPC) (rev 02)00:1f.1 IDE interface: Intel Corporation 82801CAM IDE U100 (rev 02)00:1f.3 SMBus: Intel Corporation 82801CA/CAM SMBus Controller (rev 02)00:1f.5 Multimedia audio controller:Intel Corporation 82801CA/CAM AC'97 Audio Controller (rev 02)00:1f.6 Modem: Intel Corporation 82801CA/CAM AC'97 Modem Controller (rev 02)01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 420 Go](rev a3)02:00.0 FireWire (IEEE 1394): VIA Technologies, Inc. IEEE 1394 Host Controller(rev 46)02:01.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+(rev 10)02:04.0 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)02:04.1 CardBus bridge: O2 Micro, Inc. OZ6933 Cardbus Controller (rev 01)
lspci没有标明域,但对于一台PC而言,一般仅仅有一个域,即0号域。通过这个输出我们能够看到它是一个IDE interface。由上述的 输出能够看到,我的电脑上共同拥有3个PCI总线(0号,1号,2号)。在单个系统上,插入多个总线是通过桥(bridge)来完毕的,桥是一种用来连接总线 的特殊PCI外设。
所以,PCI系统的总体布局组织为树型,我们能够通过上面的lspci输出,来画出我的电脑上的PCI系统的树型结构:
|---00:01.0(PCI桥)---01:00:0(nVidia显卡)
|
| |--00:1d:0(USB1号控制器)
|---00:1d(USB控制器)--- |
| |--00:1d:1(USB2号控制器)
|
| |--02:00.0(IEEE1394)
| |
00:00.0 --- | ---00:1e:0(PCI桥)---|--02:01.0(8139网卡)
(主桥) | |
| | |--02:04.0(桥1)
| |--02:04(CardBus桥) |
| |--02:04.1(桥2)
|
|
| |--00:1f:0(ISA桥)
| |
| |--00:1f:1(IDE接口)
| |
|---00:1f(多功能板卡)--|--00:1f:3(SMBus)
|
|--00:1f:5(多媒体声音控制器)
|
|--00:1f:6(调制解调器)
由上图能够得出,我的电脑上共同拥有8个PCI设备,当中0号总线上(主桥)上连有4个,1号总线上连有1个,2号总线上连有3个。00:1f是一个连有5个功能的多功能板卡。
之所以是上面的树型结构,是因为,PCI桥设备下,一定有所连接的另一个PCI总线(称为“次总线”,即主总线的子总线)。见下面两个图,每个PCI桥下都有次总线,次总线下面又连接着 Endpoint(Endpoint是PCIe总线上的终端设备).
而且,根据数据结构与算法,树这一数据结构,可推断出PCI桥下所连接的各个次总线的编号。