6.5.2PCI-PCI桥接器:PCI配置循环及PCI总线编号方式
图6.3 0类型PCI配置循环
图6.4 1类型PCI配置循环
为了让CPU上运行的PCI初始化代码能访问位于分支PCI总线上的设备 , 必须为桥接器提供某种机制以便它可以决定是否将配置循环从主干接口传递到其二级接口 。循环是出现在PCI总线上的一个地址 。PCI 标准定义了两种PCI配置寻址格式;类型0和类型1;它们分别如图6.3及6.4所示 。类型0 PCI配置循环不包含总线序号,同时在此PCI总线上对应于这个PCI配置地址的所有PCI设备都会来对它们进行解释 。类型0 配置循环的11 位到31位用来进行PCI设备选择 。有种设计方式是让每位代表系统中一个不同的设备 。这时11位对应PCI槽0中的PCI设备而12位标识槽1中的设备等等 , 如此类推 。另外一种方式是直接将设备的槽号写入到位31到11中 。系统使用哪种机制依赖于系统PCI内存控制器 。
类型1 PCI配置循环包含一个PCI总线序号,同时这种配置循环将被除桥接器外的所有PCI设备所忽略 。所有发现类型1 配置循环的PCI-PCI桥接器把它们看到的地址传递到各自的下级PCI总线 。至于PCI-PCI桥接器是否忽略类型1 配置循环或将其传递到PCI总线则依赖于PCI-PCI桥接器的配置方式 。每个PCI-PCI桥接器都拥有一个主干总线接口序号以及一个二级总线接口序号 。主干总线是那个离CPU最近的PCI总线而二级总线是离它稍远的PCI总线 。任何PCI-PCI桥接器还包含一个从属总线序号 , 这是所有二级总线接口所桥接的PCI总线中序号最大的那个 。或者说这个从属总线序号是PCI-PCI桥接器向下连接中PCI总线的最大序号 。当PCI-PCI桥接器看到类型1 PCI配置循环时它将进行如下操作:
如果此总线序号不在桥接器的二级总线序号和从属总线序号之间则忽略掉它 。
如果此总线序号与桥接器的二级总线序号相同则将其转换成类型0 配置命令 。
如果此总线序号位于桥接器的二级总线序号与从属总线序号之间则将它不作改变的传递到二级总线接口中 。
所以如果想寻址PCI-PCI配置例4中总线3上的设备1 , 我们继续从CPU中产生一个类型1 配置命令 。桥接器1将其传递给总线1 。桥接器2虽然忽略它但会将其转换成一个类型0 配置命令并送到总线3上 , 在那里设备1将作出相应反应 。
PCI配置中总线序号由操作系统来分配 。但是序号分配策略必须遵循对系统中所有PCI-PCI桥接器都正确的描叙:
“位于PCI-PCI桥接器后所有的PCI总线必须位于二级总线序号和从属总线序号之间” 。
如果这个规则被打破 , 则PCI-PCI桥接器将不能正确的传递与转换类型1 PCI配置循环,同时系统将找不到或者不能正确地初始化系统中的PCI设备 。为了满足这个序号分配策略 , Linux以特殊的顺序配置这些特殊的设备 。PCI-PCI总线序号分配一节详细描叙了Linux的PCI桥接器与总线序号分配策略 。
6.6Linux PCI 初始化过程
Linux中的PCI初始化代码逻辑上可分成三个部分:
PCI 设备驱动
这个伪设备驱动程序将从总线0开始搜索PCI系统并定位系统中所有的PCI设备与桥接器 。它将建立起一个描叙系统拓扑结构的数据结构链表 。另外它还为所有的桥接器进行编号 。
PCI BIOS
这个软件层提供了在bib-pci-bios定义中描叙的服务 。即使Alpha AXP没有BIOS服务 , Linux核心也将为它提供具有相同功能的代码 。
PCI Fixup
系统相关补丁代码将整理PCI初始化最后阶段的一些系统相关事物 。
6.6.1Linux 核心PCI数据结构
图6.5 Linux核心PCI数据结构
Linux核心初始化PCI系统时同时也建立了反应系统中真实PCI拓扑的数据结构 。图6.5显示了图6.1所标识的PCI示例系统中数据结构间关系 。每个PCI设备(包括PCI-PCI桥接器)用一个pci_dev数据结构来描叙 。每个PCI总线用一个pci_bus数据结构来描叙 。这样系统中形成了一个PCI总线树 , 每棵树上由一些子PCI设备组成 。由于PCI总线仅能通过PCI-PCI桥接器(除了主干PCI总线0)存取 , 所以pci_bus结构中包含一个指向PCI-PCI桥接器的指针 。这个PCI设备是PCI总线的父PCI总线的子设备 。
推荐阅读
- Linux 核心--8.中断与中断处理
- 椰子汤的功效与作用 椰子汤有什么功效
- Linux操作系统如何限制SSH密码尝试次数
- 微软公司对Linux操作系统使出的各种杀招
- Linux 核心--4.内存管理
- 以Linux做路由器的问题
- Linux 核心--1.前言
- 红豆糖水的功效与作用 红豆糖水的功效与作用禁忌
- Linux 核心--3.软件基础
- 认识Linux操作系统下三大便利开源防火墙
