说明:
-
Kernel版本:4.14
-
ARM64处理器
-
使用工具:Source Insight 3.5, Visio
1. 概述
从本文开始,将会针对PCIe专题来展开,涉及的内容包括:
-
PCI/PCIe总线硬件;
-
Linux PCI驱动核心框架;
-
Linux PCI Host控制器驱动;
不排除会包含PCIe外设驱动模块,一切随缘。
作为专题的第一篇,当然会先从硬件总线入手。进入主题前,先讲点背景知识。在PC时代,随着处理器的发展,经历了几代I/O总线的发展,解决的问题都是CPU主频提升与外部设备访问速度的问题:
-
第一代总线包含
ISA
、EISA
、VESA
和Micro Channel
等; -
第二代总线包含
PCI
、AGP
、PCI-X
等; -
第三代总线包含
PCIe
、mPCIe
、m.2
等;
PCIe(PCI Express)
是目前PC和嵌入式系统中最常用的高速总线,PCIe在PCI的基础上发展而来,在软件上PCIe与PCI是后向兼容的,PCI的系统软件可以用在PCIe系统中。
本文会分两部分展开,先介绍PCI总线,然后再介绍PCIe总线,方便在理解上的过渡,开始旅程吧。
2. PCI Local Bus
2.1 PCI总线组成
-
PCI总线(Peripheral Component Interconnect,外部设备互联)
,由Intel公司提出,其主要功能是连接外部设备; -
PCI Local Bus
,PCI局部总线,局部总线技术是PC体系结构发展的一次变革,是在ISA总线
和CPU总线
之间增加的一级总线或管理层,可将一些高速外设,如图形卡、硬盘控制器等从ISA总线
上卸下,而通过局部总线直接挂接在CPU总线上,使之与高速CPU总线
相匹配。PCI总线,指的就是PCI Local Bus
。
先来看一下PCI Local Bus的系统架构图:
从图中看,与PCI总线相关的模块包括:
-
Host Bridge
,比如PC中常见的North Bridge(北桥)。
图中处理器、Cache、内存子系统通过Host Bridge连接到PCI上,Host Bridge管理PCI总线域,是联系处理器和PCI设备的桥梁,完成处理器与PCI设备间的数据交换。其中数据交换,包含处理器访问PCI设备的地址空间
和PCI设备使用DMA机制访问主存储器
,在PCI设备用DMA访问存储器时,会存在Cache一致性问题,这个也是Host Bridge设计时需要考虑的;此外,Host Bridge还可选的支持仲裁机制,热插拔等; -
PCI Local Bus;
PCI总线,由Host Bridge或者PCI-to-PCI Bridge管理,用来连接各类设备,比如声卡、网卡、IDE接口等。可以通过PCI-to-PCI Bridge来扩展PCI总线,并构成多级总线的总线树,比如图中的PCI Local Bus #0<