图6.8 配置PCI系统:第三部分
PCI-PCI 桥接器序号分配:步骤三
PCI初始化代码将继续扫描总线1并发现另外一个PCI-PCI桥接器 , 桥3 。桥3的主干总线接口序号被设置成1 , 二级总线接口序号为3,同时从属总线序号为0xff 。图6.8给出了系统现在的配置情况 。带总线序号1、2或者3的类型1 PCI配置循环将被发送到正确的PCI总线 。
图6.9 配置PCI系统:第四部分
PCI-PCI 桥接器序号分配:步骤四
Linux开始沿PCI总线3向下扫描PCI-PCI桥接器 。PCI总线3上有另外一个PCI-PCI桥接器(桥4) , 桥4的主干总线序号被设置成3 , 二级总线序号为4 。由于它是此分支上最后一个桥接器所以它的从属总线接口序号为4 。初始化代码将重新从PCI-PCI桥接器3开始并将其从属总线序号设为4 。最后PCI初始化代码将PCI-PCI桥接器1的从属总线序号设置为4 。图6.9给出了最后的总线序号分配情况 。
6.6.3PCI BIOS 函数
PCI BIOS函数是一组适用于所有平台的标准过程 。在Intel和Alpha AXP系统上没有区别 。虽然在CPU控制下可以用它们对所有PCI地址空间进行访问 。但只有Linux核心代码和设备驱动才能使用它们 。
6.6.4PCI 补丁代码
在Alpha AXP平台上的PCI补丁代码所作工作量要大于Intel平台 。
基于Intel的系统在系统启动时就已经由系统BIOS完成了PCI系统的配置 。Linux只需要完成简单的映射配置. 非Intel系统将需要更多的配置:
为每个设备分配PCI I/O及PCI内存空间 。
为系统中每个PCI-PCI桥接器配置PCI I/O和PCI内存地址窗口 。
为这些设备产生中断连线值;用来控制设备的中断处理 。
下一节将描叙这些代码的工作过程 。
确定设备所需PCI I/O和PCI内存空间的大小
系统要查询每个PCI设备需要多少PCI I/O于PCI内存地址空间 。为了完成这项工作 , 每个基地址寄存器将被写上全1并读取出来 。设备将把不必要的地址位设为0从而有效的定义所需地址空间 。
图6.10 PCI配置头:基地址寄存器
有两类基本的基地址寄存器 , 一类标识设备寄存器必须驻留的地址空间;另一类是PCI I/O或PCI内存空间 。此寄存器的0位来进行类型的区分 。图6.10给出了对应于PCI内存和PCI I/O两种不同类型的基地址寄存器 。
确定某个基地址寄存器所需地址空间大小时,先向此寄存器写入全1再读取此寄存器,设备将在某些位填上0来形成一个二进制数表示所需有效地址空间 。
以初始化DEC 21142 PCI快速以太设备为例 , 它将告诉系统需要0x100字节的PCI I/O空间或者PCI内存空间 。于是初始化代码为其分配空间 。空间分配完毕后 , 就可以在那些地址上看到21142的控制与状态寄存器 。
为PCI-PCI桥接器与设备分配PCI I/O与PCI内存
象所有内存一样 , PCI I/O和PCI内存空间是非常有限甚至匮乏 。非Intel系统的PCI补丁代码(或者Intel 系统的BIOS代码)必须为每个设备分配其所要求的内存 。PCI I/O和PCI内存必须以自然对齐方式分配给每个设备 。比如如果一个设备要求0xB0大小的PCI I/O空间则它必须和一个0xB0倍数的地址对齐 。除此以外 , 对于任何指定桥接器 , 其PCI I/O和PCI内存基址必须以在1M字节边界上以4K字节方式对齐 。所以在桥接器下方的设备的地址空间必须位于任意指定设备上方的PCI-PCI桥接器的内存范围内 。进行有效的空间分配是一件比较困难的工作 。
Linux使用的算法依赖于由PCI设备驱动程序建立的描叙PCI设备的总线/设备树 , 每个设备的地址空间按照PCI I/O内存顺序的升序来分配 。同时再次使用遍历算法来遍历由PCI初始化代码建立的pci_bus和 pci_dev结构 。从根PCI总线开始(由pci_boot指向)PCI补丁代码将完成下列工作:
推荐阅读
- Linux 核心--8.中断与中断处理
- 椰子汤的功效与作用 椰子汤有什么功效
- Linux操作系统如何限制SSH密码尝试次数
- 微软公司对Linux操作系统使出的各种杀招
- Linux 核心--4.内存管理
- 以Linux做路由器的问题
- Linux 核心--1.前言
- 红豆糖水的功效与作用 红豆糖水的功效与作用禁忌
- Linux 核心--3.软件基础
- 认识Linux操作系统下三大便利开源防火墙
