PCI
下载
第5章 PCI
P C I的英文全称为Periheral Component Interconnect。正如它的名称一样,P C I局部总线是
微型计算机系统上处理器 /存储器与外围控制部件、外围附加板之间的互连机构。“P C I局部总
线规范3”规定了互连机构的协议、电气、机械以及配置空间规范。本章主要介绍 L i n u x的内
核如何初始化系统的P C I总线和设备。
图1 - 5 - 1是一个基于P C I局部总线的系统逻
辑示意图。P C I局部总线和P C I - P C I桥是将系统
的部件...
下载
第5章 PCI
P C I的英文全称为Periheral Component Interconnect。正如它的名称一样,P C I局部总线是
微型计算机系统上处理器 /存储器与外围控制部件、外围附加板之间的互连机构。“P C I局部总
线规范3”规定了互连机构的协议、电气、机械以及配置空间规范。本章主要介绍 L i n u x的内
核如何初始化系统的P C I总线和设备。
图1 - 5 - 1是一个基于P C I局部总线的系统逻
辑示意图。P C I局部总线和P C I - P C I桥是将系统
的部件连接起来的连接器。 C P U连接到P C I局
部总线0 ,这条总线主要用于连接视频设备。
被称为P C I - P C I桥的特别P C I设备将P C I局部总
线0与从P C I局部总线连接起来。这种“从 P C I
总线”被称为 P C I局部总线1。按照P C I规范的
术语来讲, P C I局部总线1被称作位于 P C I - P C I
桥的下游 ( d o w n s t r e a m ),而P C I局部总线0被称
为桥的上游 ( u p - s t r e a m )。从P C I局部总线主要
连接系统的 S C S I设备和以太网设备。桥、从
P C I局部总线以及上面的两种设备都可以物理
地集成在同一个 P C I集成卡中。系统中的 P C I -
I S A桥支持老式、遗留下来的 I S A设备。在图1 - 5 - 1中画出了一个超级 I / O控制器芯片,它可以
控制键盘、鼠标和软盘驱动器。
5.1 PCI的地址空间
C P U和P C I的设备需要访问在二者之间共享的存储空间。这部分存储器用于设备驱动程序
控制P C I设备并在驱动程序和设备之间传递信息。典型的共享存储器包括设备的控制和状态寄
存器,这些寄存器可以控制 P C I设备并读取设备的状态信息。例如: P C I的S C S I设备驱动程序
从S C S I设备读取状态信息,以确定 S C S I设备是否可以向S C S I磁盘写入一整块的数据。S C S I设
备驱动程序还可以在启动后,向控制寄存器写入控制命令以启动 S C S I设备运行。
C P U的系统存储器可以用作共享存储器。但如果这样做的话,每次 P C I设备访问存储器时,
C P U不得不暂停,等待P C I设备完成访存操作。这样访存操作就变成每次只有一个系统部件可
以访存,导致整个系统的性能下降。让系统的外设以不加控制的方式来访问主存本身就不是
一个好
。这样做非常危险,因为一个劣质的外设会使系统非常不稳定。因此外设可以有
自已的存储空间, C P U可以访问这些存储空间而外设对系统存储空间的访问用 D M A ( D i r e c t
Memory Access,直接存储访问 )通道的方式来严加控制。 I S A设备可以访问两类地址空间:
I S A的I / O空间和 I S A存储空间。P C I设备可以访问三类地址空间: P C I的I / O空间、P C I的存储
空间和P C I的配置空间。所有的这些空间对 C P U来说都是可访问的,其中 P C I的I / O空间和P C I
图1-5-1 基于PCI局部总线系统的示例
桥 桥
总线0
上游
下游
视频总线
控制器
总线1
存储空间被设备驱动程序使用, P C I的配置空间被L i n u x内核中的初始化程序使用。
Alpha AXP处理器不支持对除系统地址空间之外的其他地址空间的直接访问。它使用支持
芯片组来访问像P C I配置空间这样的其他地址空间。实现上一般采用分析地址映射机制,即从
整个虚拟地址空间中窃取一部分地址空间,并把它映射到 P C I的地址空间上。
5.2 PCI配置头
系统中的每个P C I设备(包括P C I - P C I桥设备)都在P C I的配置地址空间的某处有一个配置数
据结构。P C I的配置头允许系统来标识、控制设备。而 P C I配置头在P C I配置地址空间的精确
位置依赖于设备在P C I拓朴结构图中的位置。例如:一块 P C I视频卡插到P C I主板的一个P C I插
槽中,它的配置头会出现在 P C I配置空间的一个地址上;如果把它换到另一个 P C I插槽中,那
么它的配置头会出现在另一个地址上。但这种情况不会造成混淆,因为无论 P C I设备和桥在哪
里,系统都会使用它们的配置头中的状态和配置寄存器找到并配置这些设备。
典型的系统一般都被
成使每个P C I插槽的配置头的偏移量与插槽在主板上的位置相关。
例如:主板上的第一个P C I插槽的P C I配置头的偏移量是0,第二个的偏移量是2 5 6 (注:所有的配
置头有相同的长度—2 5 6个字节),其他的以此类推。P C I总线规范定义了一种与系统相关的硬
件机制,使得P C I的配置程序通过检验P C I总线上所有可能的P C I配置头中的一个域,就能区分哪
些设备是连接在总线上的,那些是断开的。“P C I局部总线规范3”定义了在读取空P C I插槽的厂
商标识和设备标识域时,会返回值为0 X F F F F F F F F的错误信息。因此P C I的配置程序一般读取配
置头中的厂商标识域来判定PCI插槽的状态。如果返回错误信息0XFFFFFFFF,则说明插槽为空。
图1 - 5 - 2给出了2 5 6字节的P C I配置头的格式,它包含下列几个域:
• 厂商标识(Vendor Id) 是一个用于唯一标识 P C I设备
生产厂商的数值。 D i g i t a l公司的 P C I厂商标识为
0 x 1 0 11,而I n t e l的是0 x 8 0 8 6。
• 设备标识(Device Id) 用于唯一标识一个特定设备的
数值。例如D i g t a l公司的2 11 4 1快速以太网设备的设备
标识为0 x 0 0 0 9。
• 状态(S t a t u s) 根据 “P C I局部总线规范3”定义的域
中每个位的含义来给出设备的状态。
• 命令(C o m m a n d) 系统通过向这个域中写入命令来控
制设备。例如:可以写入允许设备访问 PCI I/O地址
空间的命令。
• 分类码(Glass Code) 是设备类型的标识。规范对每
种设备进行了
的分类。如视频设备、 S C S I设备
等等。S C S I的分类码为0 x 0 1 0 0。
• 基地址寄存器(Base Address Register) 这些寄存器用
于决定设备可以使用的 PCI I/O空间和存储空间的类
型、大小,并指定它们的起始位置。
• 中断引脚(P i n) P C I卡有4个物理引脚,用于把中断从卡上发送到 P C I总线上。它们的标
准标号为A、B、C、D。中断引脚 (interrupt pin)域用于标识该P C I设备使用哪个引脚。一
50 第一部分 Linux内核
下载
图1-5-2 PCI配置头
第5章 PCI 51
下载
般这种功能是由每个设备硬件实现的。也就是说,每次系统启动时,该设备都使用相同
的中断引脚。这个信息的用处是让中断处理子系统可以处理来自该设备的中断。
• 中断线(L i n e) 设备的P C I配置头的中断线域用于在设备驱动程序的P C I初始化代码和L i n u x
中断处理子系统间传递中断处理。写入中断线(interrupt line)域的数字对设备驱动程序来说
是无意义的。但它允许中断处理器正确地把来自P C I设备的中断传送到操作系统中对应的
设备驱动程序中断处理例程中。若想更进一步了解L i n u x如何处理中断,请看第6章。
5.3 PCI的I/O和存储地址空间
P C I设备共有两类地址空间可以用于与在核态运行的设备驱动程序进行通信。例如: D E C
公司的2 11 4 1快速以太网设备芯片把它的内部寄存器映射到 P C I的I / O地址空间中,这样它的设
备驱动程序就可以通过读、写这些寄存器来控制快速以太网设备。典型的视频设备驱动程序
通常会使用大量的P C I存储地址空间来获得视频信息。
在P C I系统建立之前和使P C I配置头中的命令域允许设备访问这些地址空间之前, P C I设备
是不可设问的。在 L i n u x系统中,只有P C I配置程序能读写 P C I的配置地址空间,而 L i n u x的设
备驱动程序只能读写P C I的I / O和存贮器地址空间。
5.4 PCI-ISA桥
P C I - I S A桥通过把对P C I的I / O和存储地址空间的访问转换成对 I S A的I / O和存储器的访问,
来实现对老的 I S A设备的支持。现在售出的大量 P C系统都包括几个 I S A总线插槽和几个P C I总
线插槽。随着时间的推移,对这种向后兼容能力的需求会不断减少,最后会出现只有 P C I总线
的P C系统。在 I S A地址空间中, I S A设备有一些由早期基于 Intel 8080的P C定义的一些固定的
寄存器。例如即使一台售价为 5 0 0 0美元的Alpha AXP计算机系统,也会像第一台 IBM PC一样
在ISA I/O地址空间的相同位置留有 I S A软盘控制器。P C I规范通过将P C I的I / O和存贮地址空间
的低端保留给系统中的 I S A外设使用,用一个 P C I - I S A桥把对这部分 P C I存储空间的访问转换
为对I S A地址空间访问的方式,解决了上述兼容问题。
5.5 PCI-PCI 桥
P C I - P C I桥是将系统中的所有P C I总线连接在一起的特殊的P C I设备。简单的系统可以只有
一条P C I总线。但是一条总线可以支持的 P C I总线数受它的电气特性的限制。通过 P C I桥增加
更多的P C I总线可以使系统支持更多的 P C I设备,这对一台高性能的服务器来说是至关重要的。
当然,L i n u x完全支持使用P C I - P C I桥。
5.5.1 PCI-PCI桥:PCI I/O和存储地址空间的窗口
P C I - P C I桥只是把对部分PCI I/O和存储地址空间的读写请求传送到下游。例如:对图1 - 5 - 1,
如果读写的是S C S I设备或以太网设备的 PCI I/O和存储地址空间, P C I - P C I桥会把这些读写从
P C I总线0传送到P C I总线1,而忽略对其他PCI I/O和存储地址空间的访问。这种过滤功能防止
了系统中不必要的地址传播。为了达到这个目标,必须对系统中的 P C I - P C I桥进行编程,为从
主总线传送到从总线的PCI I/O和存储地址访问指定基址和上界。一旦系统中的 P C I - P C I桥配置
成功了,那么只要L i n u x设备驱动程序,通过这些窗口访问 P C I的I / O和存贮器地址空间, P C I -
52 第一部分 Linux内核
下载
P C I桥对它们来说就是不可见的。这对 Linux PCI 设备驱动程序的编写者来说就是一个减轻工
作量的重要特征。但它却使得 L i n u x配置P C I - P C I桥变得非常复杂。
5.5.2 PCI-PCI桥:PCI配置周期和PCI总线编号
由于C P U的P C I初始化代码可以查找出不在主 P C I总线上的设备。因此P C I - P C I桥也一定有
一种机制,使得它可以决定是否把配置周期从主接口传送到从接口上去。周期在 P C I总线上总
以地址的形式出现。P C I规范定义了两种类型的P C I配置地址:0型和1型,图1 - 5 - 3和图1 - 5 - 4给
出了它们的格式。0型的P C I配置周期不包含总线号,由该总线上的设备像解释 P C I配置地址一
样进行解释。0型配置周期的11至3 1位是设备选择域。一种设计系统的方式是由设备选择域的
每一位选择一个设备,这时第 11位可以选择在插槽 0的P C I设备,第1 2位可以选择在插槽 1的
P C I设备,并以此类推;另一种实现方式是把 P C I设备号直接写到第 11到3 1位中。一个系统使
用哪种实现方式依赖于系统的 P C I存储控制器。
图1-5-3 0型 PCI配置周期
图1-5-4 1型PCI配置周期
1型P C I配置周期包含P C I总线号。除了P C I - P C I桥之外所有的P C I设备都忽略它。所有看到
1型配置周期的P C I - P C I桥可以选择把它们传送到与自己相连的下游 P C I总线上。而P C I - P C I桥
是忽略1型配置周期还是把它传送到下游的 P C I总线取决于P C I - P C I桥的配置。每个P C I - P C I桥
都有一个主总线接口号和一个从总线接口号。其中主总线接口指离 C P U近的一端,而从总线
接口指离C P U较远的一端。每个P C I - P C I桥还有一个下级总线号,它是从从总线接口桥接出去
的所有P C I总线中最大的总线号。从另一角度来讲,下级总线号指位于 P C I - P C I桥下游的最大
P C I总线号。在P C I - P C I桥收到1型P C I配置周期时,它可以做下列操作之一:
1) 如果指出的总线号不在桥的从总线号和下级总线号 (包括下级总线号 )之间,桥简单地
忽略它。
2) 如果指出的总线号等于桥的从总线号,桥将 1型配置周期转变为0型配置周期。
3) 如果指出的总线号大于桥的从总线号,而小于等于桥的下级总线号。桥将其无变化地
传送到从总线接口上。所以要想在图 1 - 5 - 9的系统拓扑图中寻址总线 3上的设备1,C P U会在总
线0上产生一个1型配置命令。桥1将此命令无变化地传到总线 1上,桥2会忽略它,而桥 3会把
它转化为0型配置命令,发送到总线3上。在那儿设备1对其作出响应。
在P C I配置期间,由操作系统独立地分配总线号。但无论采用什么编号方式,系统中的
P C I - P C I桥必须遵守如下规则:
所有在P C I - P C I桥下游的P C I总线号必须在该桥的从总线号和下级总线号 (包含它)之间。
如果这个规则被打破了,那么P C I - P C I桥就无法正确地传递和转换1型P C I配置周期,而操作
第5章 PCI 53
下载
系统也无法发现、初始化系统中的所有 P C I设备。为了遵循上述编号方式,L i n u x按一种特别的
方式来配置这些特殊设备。5 . 6 . 2节根据一个工作示例详细讲述了L i n u x的P C I桥和总线编号机制。
5.6 Linux PCI初始化
L i n u x系统中的P C I初始化程序分成三个逻辑部分。
• P C I设备驱动程序 这个伪设备驱动程序从总线 0开始搜索P C I系统,定位系统中所有的
P C I设备和桥。它建立一个数据结构的链表来描述系统的拓扑结构。另外,它还为所有
找到的桥分配编号。
• PCI BIOS 这一软件层提供了“ PCI BIOS只读存储器规范 4”指出的所有服务。尽
管Alpha AXP没有B I O S服务,但在 L i n u x内核中有等价的代码来提供相同的功能服
务。
•P C I修理部分 与系统相关的修理程序,用于整理与系统相关的 P C I初始化过程中的故障
点。
5.6.1 Linux内核PCI数据结构
L i n u x内核初始化 P C I系统时,它将建立
起能反映系统中实际的 P C I拓扑结构的数据
结构。图1 - 5 - 5给出了各数据结构之间的关系。
它是从图 1 - 5 - 1中的示例性 P C I系统导出的。
每个P C I设备由p c i _ b u s数据结构来描述。最
后产生的结果是一种树形结构的 P C I总线,
其中每个总线有若干个子 P C I设备连接在上
面。由于一个 P C I总线只能通过 P C I - P C I桥才
能到达,所以除总线 0以外,每个 p c i _ b u s数
据结构都包括指向与其相连的位于上游的
P C I - P C I桥的指针。 P C I设备是所在 P C I总线
的父总线的子辈。在图 1 - 5 - 5中给出了名为
p c i _ d e v i c e s的指向系统中所有 P C I设备的指
针,系统中每个 P C I设备都将它们的 p c i _ d e v
数据结构加入到这个队列中,该队列由
L i n u x内核使用,以快速找到系统中所有的
P C I设备。
5.6.2 PCI设备驱动程序
P C I设备驱动程序根本就不是一个真正的
驱动程序,它只是在系统初始化时由操作系
统调用的一个函数。 P C I初始化程序必须先
扫描系统中的所有P C I总线,查找系统中的所有P C I设备(包含P C I - P C I桥)。它使用PCI BIOS中
的例程来确定当前正在扫描的 P C I总线的每个 P C I插槽是否是空的。如果 P C I插槽被占用了,
图1-5-5 Linux内核中PCI数据结构
桥桥 视频
它会建立一个描述该设备的 p c i _ d e v数据结构,并把它连入由p c i _ d e v i c e s指针指向的已知P C I设
备链表中。
P C I初始化程序从 P C I总线0开始扫描,它对每个 P C I插槽中的每个可能的 P C I设备都读取
厂商标识域和设备标识域。一旦找到了一个被占用的插槽,它会建立一个描述该设备的
p c i _ d e v数据结构,由 P C I初始化程序建立的所有 p c i _ d e v数据结构 (包括P C I - P C I桥)都被链入
p c i _ d e v i c e s指向的链表中。
如果P C I初始化程序发现某个 P C I设备是桥,就会建立一个 p i c _ b u s数据结构,并把它链接
到由p c i _ r o o t指向的p c i _ b u s和p c i _ d e v数据结构的树中。由于 P C I - P C I桥的分类码为0 X 0 6 0 4 0 0,
所以P C I初始化程序可以区分某个设备是否为 P C I - P C I桥。L i n u x内核会立即配置在 P C I - P C I桥
下游的P C I总线;如果在那条总线上还有多个 P C I - P C I桥,那么它们也会被配置。这个过程被
称为深度优先算法 (depthwise algorithm)。因此在广度搜索之前,系统的 P C I拓扑结构先按深度
优先的方式进行映射。图 1 - 5 - 1中,L i n u x在配置P C I总线0上的视频设备之前,首先配置 P C I总
线1上的以太网和S C S I设备。
在L i n u x插索下游P C I总线时,它还要配置P C I - P C I桥的从总线号和下级总线号之间的间隔。
这将在5 . 6 . 2小节详细介绍。
配置P C I - P C I桥—分配P C I总线号
要想让P C I - P C I桥传递对PCI I/O地址空间、存储地址空间和 P C I配置地址空间的读写,需
要知道下列的信息:
• 主总线(primary bus)号 与P C I - P C I桥直接相连的上游P C I总线的总线号。
• 从总线(secondary bus)号 与P C I - P C I桥直接相连的下游P C I总线的总线号。
• 下级总线(subordinate bus)号 由该桥的下游可以到达的所有 P C I总线中最大的总线号。
• PCI I/O和存储器窗口 P C I - P C I桥所有下游地址的PCI I/O地址空间和P C I存储地址空间
的窗口的基址和大小。
问题是当你想配置一个给定的P C I - P C I桥时,却无法知道该桥下级总线的数目。即使知道了,
但仍不知道下游是否还有P C I - P C I桥以及给它们分配什么标号。解决的办法是使用反向的深度优
先搜索算法,先搜索与 P C I桥相连的每条总线,并为找到的总线分配标号。在找到每一个 P C I -
P C I桥和它的从总线号后,先为P C I - P C I桥分配一个0 x F F的临时下级总线号,再去搜索它的下游
的所有P C I - P C I桥并为其分配标号。上述算法看起来很复杂,但下面的例子有助于理解该算法。
1. PCI-PCI桥标号过程:第1步
使用图1 - 5 - 6的拓扑结构图,搜索过程会先发现桥 1。与桥1相连的下游总线被标号为1,所
以桥1的从总线标号为 1而临时的下级总线标号为 0 X F F。这表示所有指出的 P C I总线号大于等
于1的1型配置地址都会穿过桥1,到达P C I总线1上。如果1型配置地址指出的总线号为 1,则会
被转换成0型配置周期,其他的总线号会被无变化的传送到总线 1上。上面的过程正是 L i n u x
P C I初始化程序为了继续搜索P C I总线1所做的。
2. PCI-PCI桥标号过程:第2步
由于L i n u x使用深度优先算法,所以初始化程序会继续搜索总线 1,在总线 1上它找到了
P C I - P C I桥2,由于在P C I - P C I桥2下面再没有P C I - P C I桥了,所以它为桥2分配了值为2的下级总
线号。它与桥2从接口总线号相同。图1 - 5 - 7给出了在这一时刻初始化程序是如何为总线和 P C I -
P C I桥标号的。
54 第一部分 Linux内核
下载
图1-5-6 配置一个PCI系统:第1步
图1-5-7 配置一个PCI系统:第2步
3. PCI-PCI桥标号过程:第3步
P C I初始化程序回头继续搜索 P C I总线1,找到了另一个 P C I - P C I桥—桥3。因此桥 3的
主总线接口号为 1,从总线接口号为 3,临时的下级总线号为 0 x F F。图1 - 5 - 8给出了目前系统
的配置信息, 这时总线号为 1、2、3的1型P C I配置周期能被正确地传送到对应的 P C I总线
上。
4. PCI-PCI桥标量过程:第4步
L i n u x开始搜索P C I - P C I桥4下游的P C I总线3。在P C I总线3上有另一个P C I桥4,因此桥4的
第5章 PCI 55
下载
总线
总线
桥
桥
桥
桥
总线
总线
总线
总线
总线
桥桥
桥
桥
总线
总线
总线
56 第一部分 Linux内核
下载
主总线号为3,从总线号为4,由于它是在这条分支上的最后一个桥,所以其下级总线号为 4。
初始化回到P C I - P C I桥3时,给它分配4作为下级总线号。P C I初始化程序给桥1最后分配的下级
总线号为4。图1 - 5 - 9给出了最终的总线和桥的标号情况。
图1-5-8 配置一个PCI系统:第3步
图1-5-9 配置一个PCI系统:第4步
5.6.3 PCI的BIOS函数
P C I的B I O S函数是一套跨越平台的通用标准例程。例如,在 I n t e l平台和Alpha AXP平台上
它们都是相同的。B I O S函数允许C P U控制对所有P C I地址空间的访问,但只有 L i n u x内核和设
总线
总线
总线
总线
总线
桥
桥
桥
桥
总线
桥
桥
桥
桥
总线
总线
总线
总线
备驱动程序可以使用它们。
5.6.4 PCI修正过程
Alpha AXP 系统的P C I修正程序做的工作要比 Intel 多得多。由于 I n t e l系统有系统B I O S,
它在系统启动时运行,几乎完全配置好了 P C I系统。所以 I n t e l系统的P C I修正程序除了对配
配信息进行映射外,几乎没什么可做的。对于非 I n t e l的系统则需要做如下的进一步配置工
作:
• 为每个设备分配PCI I/O空间和PCI 存贮器空间。
• 为系统中的每个P C I - P C I桥配置PCI I/O和存贮器地址窗口。
• 为设备设置中断线的值,通过这种方法控制设备的中断处理。
下面几小段讲述修正程序的工作过程。
1. 确定每个设备需要的PCI I/O空间和P C I存储空间的大小
修正程序对找到的每个P C I进行询问,以确定它需要的 PCI I/O空间和P C I存储地址空间的
大小。为了达到这个目的,修正程序向每个设备的基址( Base Address)寄存器写入全1,然后
读出。设备会在它不关注的地址返回 0,在其他位明确指出所需的地址空间大小。
系统中有两种基本类型的基址寄存器,用于指出设备寄存器是位于 P C I的I / O空间中,还
是在P C I的存贮空间中。这是由寄存器的第 0位来指示的。图1 - 5 - 1 0给出了两种分别放在P C I的
存贮空间和P C I的I / O空间的基址寄存器的形式。
图1-5-10 PCI配置头:基址寄存器
为了确定一个基址寄存器需要多少地址空间,修正程序要先向寄存器中写入全 1,然后再
从该寄存器中读取。设备会把不关注的地址位设为 0,在其余位明确给出所需的地址空间。这
种方式表明使用的所有地址空间的大小都是 2的幂次,并且按自然边界对齐。例如:当你在初
始化D E C片组的2 1142 PCI快速以太网设备时,该设备会通知你,它需要 0 x 1 0 0字节的PCI I/O
地址空间或者P C I存贮空间。初始化程序为它分配空间,一旦分配了空间以后, 2 11 4 2的控制
和状态寄存器在这些地址空间就是可见的了。
第5章 PCI 57
下载
基址
基址
PCI存储空间的基址
PCI I/0空间的基址
2. 为P C I - P C I桥和设备分配PCI I/O空间和P C I存贮空间
像所有的存贮器一样,PCI I/O和存贮空间是有限的,并且十分匮乏。非 I n t e l系统的P C I修
正程序必须在考虑效率的原则下,为每个设备分配其所需数量的存储器。分配给每个设备的
PCI I/O空间和存储空间,必须按自然边界对齐。例如:如果一个设备请求 0 x B 0大小的PCI I/O
空间,那么它必须按照能被 0 x B 0整除的地址进行对齐。除此之外,任何一个桥的 PCI I/O空间
和P C I存储空间的基址必须分别按照 4 K和1 M的边界进行对齐。由于任何一个下游设备的地址
空间必须位于所有的上游 P C I - P C I桥存贮空间的地址范围内,所以有效的分配空间是比较困难
的问题。
L i n u x使用的算法依赖于由 P C I设备驱动程序建立的总线 /设备树中的设备来分配 P C I的I / O
地址空间,它是按照升幂的顺序来分配的。 L i n u x再次使用了一个反向算法来遍历由 P C I初始
化程序建立的 p c i _ b u s和p c i _ d e v数据结构。B I O S的修正程序从由 p c i _ r o o t指向的根P C I总线开
始执行算法。
• 分别为当前的全局PCI I/O空间和存贮空间的基址按4 K和1 M进行对齐。
• 对当前总线上的每个设备 (按所需PCI I/O空间大小的升幂顺序 )执行下列操作:
—为其在PCI I/O空间和/或P C I存贮空间分配空间。
—按适合的数量调整全局PCI I/O和存储空间的基址。
—允许设备使用PCI I/O和存储空间。
• 为当前总线的所有下游总线递归分配空间。注意这会改变全局 PCI I/O和存储空间的基
址。
• 分别按4 K和1 M字节边界对当前的全局 PCI I/O和存储空间的基址执行对齐操作。在对
齐操作的过程中,计算出当前 P C I - P C I桥所需的PCI I/O窗口和P C I存储窗口的大小和基
址。
• 对P C I - P C I桥进行编程,将当前总线与它的 PCI I/O空间和P C I存储空间的基址、上界链
接起来。
• 打开P C I - P C I桥对PCI I/O空间和P C I存储空间访问的桥接功能。这表示任何对桥的主 P C I
总线的PCI I/O 空间和P C I存贮空间的访问,如果落在它的PCI I/O和P C I存储地址窗口内,
都会被桥接到它的从P C I总线上。
以图1 - 6 - 1中的P C I系统作为例子,P C I修正程序将按如下的方式建立系统:
• 对齐P C I基址 P C I的I / O空间是按4 K边界进行对齐的,而P C I存储空间是按1 M边界
对齐。这种方式允许P C I - I S A桥把到它下游的所有地址转换成 I S A地址周期。
视频设备 视频设备需要2 M的P C I存储空间,因此我们在当前的 P C I存储空间中为它分配
基址为0 x 2 0 0 0 0 0的2 M空间。很明显它与设备要求的内存大小是自然对齐的。当前 P C I存贮空
间的基址移到了0 x 4 0 0 0 0 0,而PCI I/O空间的基址仍保持在0 x 4 0 0 0处。
P C I - P C I桥 现在通过P C I - P C I桥为它下游的设备分配了P C I存储空间。由于基址已经正确
地对齐了,所以不必再去做基址对齐操作了。
a. 以太网设备 该设备要求0 x B 0字节的PCI I/O空间和P C I存储空间。因此修正程序
为该设备的PCI I/O空间分配的基址为 0 x 4 0 0 0,为P C I存储空间分配的基址为 0 x 4 0 0 0 0 0。
当前P C I存储空间的基址移到0 x 4 0 0 B 0处,PCI I/O空间的基址移到0 x 4 0 B 0处。
58 第一部分 Linux内核
下载
b. SCSI设备 该设备需要1 K的P C I存储空间。因此在执行自然边界对齐操作后,为该设
备分配的P C I存储空间的基址为0 x 4 0 1 0 0 0。当前的PCI I/O空间的基址仍为0 x 4 0 B 0,而当前P C I
存储空间的基址移到了0 x 4 0 2 0 0 0。
P C I - P C I桥的PCI I/O空间和存储空间的窗口:
我们再回到上游的 P C I - P C I桥,为它设置 PCI I/O空间的窗口的范围为 0 x 4 0 0 0到0 x 4 0 B 0,
它的P C I存储空间窗口的范围为 0 x 4 0 0 0 0 0到0 x 4 0 2 0 0 0。上面的设置表示,如果是以太网设备
和S C S I设备的话,P C I - P C I桥会忽略对视频设备的 P C I存储空间的访问,并把它们转发到下游
总线上。
第5章 PCI 59
下载
第5 章PCI
5.1 PCI 的地址空间
5.2 PCI 配置头
5.3 PCI 的I/O 和存储地址空间
5.4 PCI-ISA 桥
5.5 PCI-PCI 桥
5.5.1 PCI-PCI 桥:PCI I/O 和存储地址空间的窗口
5.5.2 PCI-PCI 桥:PCI 配置周期和PCI 总线编号
5.6 Linux PCI 初始化
5.6.1 Linux 内核PCI 数据结构
5.6.2 PCI 设备驱动程序
5.6.3 PCI 的BIOS 函数
5.6.4 PCI 修正过程
本文档为【PCI】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。