标题: Linux Kernel核心中文手册 6-1 [打印本页] 作者: linjiang.com 时间: 2007-7-18 23:03 标题: Linux Kernel核心中文手册 6-1 Linux Kernel核心中文手册 来自:蓝森林自由软件
Chapter 6 PCI
Peripheral Component Interconnect ( PCI ),好像它的名字暗示的一样,是描述如何通过一个结构化和可控制的方式把系统中的外设组件连接起来的一个标准。标准的 PCI Local Bus 规范描述了系统组件电气连接的方法和它们行为的方法。本章探讨 Linux 核心如何初始化系统的 PCI 总线和设备。
CPU 的使用的系统内存可以用作这种共享内存,但是如果这样的话,每一次 PCI 设备访问内存, CPU 都不得不停顿,等待 PCI 设备完成。对于内存的访问通常有限制,同一时间只能有一个系统组件允许访问。这会使得系统速度降低。允许系统的外部设备在一个不受控的方式下访问主内存也不是一个好主意。这会非常危险:一个恶意的设备会让系统非常不稳定。
外部设备由它们自己的内存空间。 CPU 可以访问这些空间,但是设备对于系统内存的访问受到严格的控制,必须通过 DMA ( Direct Memory Access 直接内存存取)通道。 ISA 设备可以访问两种地址空间: ISA I/O (输入 / 输出)和 ISA 内存。 PCI 由三中: PCI I/O 、 PCI 内存和 PCI 配置空间( configuration space )。 CPU 可以访问所有的地址空间其中 PCI I/O 和 PCI 内存地址空间由设备驱动程序使用而 PCI 配置空间由 Linux 和心中的 PCI 初始化代码使用。
Device Identification 描述设备自身的唯一数字。例如 Digital 的 21141 快速以太网设备的设备标识符是 0x0009 。
Status 此域给除了设备的状态,它的位的含义由 PCI Local Bus 规范规定。
Command 系统通过写这个域控制这个设备。例如:允许设备访问 PCI I/O 内存。
Class Code 标识了设备的类型。对于每一种设备都有标准分类:显示、 SCSI 等等。对于 SCSI 的类型编码是 0x0100 。
Base Address Registers 这些寄存器用于确定和分配设备可以使用的 PCI I/O 和 PCI 内存的类型、大小和位置。
Interrupt Pin PCI 卡的物理管脚中的 4 个用于向 PCI 总线传递中断。标准中把它们标记为 A 、 B 、 C 和 D 。 Interrupt Pin 域描述了这个 PCI 设备使用那个管脚。通常对于一个设备来说这时硬件决定的。就是说每一次系统启动的时候,这个设备都使用同一个中断管脚。这些信息允许中断处理子系统管理这些设备的中断。
Interrupt Line PCI 配置头中的 Interrupt Line 域用于在 PCI 初始化代码、设备驱动程序和 Linux 的中断处理子系统之间传递中断控制。写在这里的数字对于设备驱动程序来讲是没有意义的,但是它可以让中断处理程序正确地把一个中断从 PCI 设备发送到 Linux 操作系统中正确的设备驱动程序的中断处理代码处。 Linux 如何处理中断参看第 7 章。
这两种地址空间用于设备和 CPU 上运行的 Linux 核心的它们的设备驱动程序通讯。例如: DECchip 21141 快速以太网设备把它的内部寄存器映射到了 PCI I/O 空间。然后它的 Linux 设备驱动程序通过读写这些寄存器来控制设备。显示驱动程序通常使用大量的 PCI 内存空间来放置显示信息。
这种桥把对于 PCI I/O 和 PCI 内存地址空间的访问转换成为 ISA I/O 和 ISA 内存访问,用来支持 ISA 设备。现在销售的多数系统都包括几个 ISA 总线插槽和几个 PCI 总线插槽。这种向后的兼容的需要会不断减少,将来会有只有 PCI 的系统。在早期的 Intel 8080 基础的 PC 时代,系统中的 ISA 设备的 ISA 地址空间( I/O 和内存)就被固定下来。甚至一个 S5000 Alpha AXP 基础的计算机系统的 ISA 软驱驱动器的 ISA I/O 地址也会和第一台 IBM PC 一样。 PCI 规范保留了 PCI I/O 和 PCI 内存的地址空间中的较低的区域保留给系统中的 ISA 外设并使用一个 PCI-ISA 桥把所有对于这些区域的 PCI 内存访问转换为 ISA 访问。