The Linux Plug-and-Play HOWTO 中文版 作者: David S.Lawyer [1]bf347@lafn.org 译者: 杜克石 [2]rock@371.net v0.00, November 1998 _________________________________________________________________ 帮助你理解和使用 PnP 设备. 如何使你的 Linux 支持 PnP. 第一个版本是不完 整的, 但也许对你有用. _________________________________________________________________ 1. 介绍 * 1.1 版权, 商标, 不担保, 和 信用 * 1.2 未来计划: 你也可以帮忙 * 1.3 此 HOWTO 的新版本 2. PnP 怎麽做: 分配 "资源" * 2.1 什麽是 Plug-and-Play (PnP)? * 2.2 计算机如何找设备(和 反过来) * 2.3 IRQ's -- 概述 * 2.4 DMA 通道 * 2.5 Memory 段 * 2.6 两种 "资源" * 2.7 问题 3. Plug-and-Play (PnP) 解决方案 * 3.1 介绍 * 3.2 Linux 需要 PnP * 3.3 总线问题 * 3.4 设置 PnP BIOS 4. 如何对付 PnP 卡 * 4.1 介绍 * 4.2 禁用 PnP ? * 4.3 BIOS 配置 PnP * 4.4 Isapnp * 4.5 修补核心让 Linux 支持 PnP * 4.6 PnP 软件和文档 5. 附录 * 5.1 地址 * 5.2 中断 -- 详述 * 5.3 Isolation _________________________________________________________________ 1. 介绍 1.1 版权, 商标, 不担保, 和 信用 本小节请看原文 版权 Copyright (c) 1998 by David S. Lawyer. Please freely copy and distribute (sell or give away) this document. You may create derivative works and distribute them provided you: I. For the case of minor changes and corrections where there exists a current maintainer: Send your proposed changes to the current maintainer first. You may distribute (per II. below) only if the current maintainer neglects to incorporate your changes in a timely manner. If the changes are only to correct typos, you need not wait for a reply from the maintainer before you distribute. II. In all other cases: 1. Make a good faith effort to insure that a copy of the derivative work (including any master copy) gets on the Internet at a well-known (and mirrored) site for free downloading. 2. If you change the license, license the work in the spirit of this license, or use GPL (Free Software Foundation). 3. The major authors become the copyright owners (not to exceed 2). Minor contributions do not make you an author. 4. Make a good faith effort to contact the maintainer (or copyright owners if there is no maintainer) to let them know what you have done. If the changes are extensive, then you should also attempt to make more such contacts (including prior to your project). 5. Give full credit to significant previous authors and contributors although the credits section need not exceed 1% of the length of the document. 商标 If certain words are trademarks, the context should make it clear to whom they belong. For example "MS Windows" (or just "Windows") implies that "Windows" belongs to Microsoft (Micro$oft). 不担保 Much of the info in this HOWTO was obtained from Serial-HOWTO, the Internet, sales clerks, etc. and may be unreliable. While I haven't intentionally tried to mislead you, there are likely a number of errors in this document. Please let me know about them. Since this is free documentation, it should be obvious that neither I nor previous authors can be held legally responsible for any errors. 1.2 未来计划: 你也可以帮忙 请告诉我你的种种想法. 但首先注意, 如果你手中的版本是一个月以前的, 请看 是否有新版本. 此 HOWTO 第一个版本, 0.00, 我甚至没有看书: PnP 体系结构, 也并不完全理解 PnP. 也没有比较二个把 Linux 变成 PnP 操作系统的补丁的不同. 我不会充分解 释 BIOS 如何设置 PnP(更不要说补丁如何做了). 此 HOWTO 是不完整的并且可能 不正确(假如我错了, 请告诉我). 在此 HOWTO 中我使用 ?? 来表示我不知道答 案. 你想改进(重写)和维护此 HOWTO 吗? 我正在找人. 1.3 此 HOWTO 的新版本 此 HOWTO 的新版本可以在 LDP 的镜像站点上找到. 首先看 [3]http://sunsite.unc.edu/LDP/mirrors.html, 当你找到一个近的镜像站点 後, 点击 "Linux Documentation Project" (LDP), 在其它格式 HOWTO 中找. 如 果你仅仅想知道最新版本的日期, 你不必使用镜像站点, 看 [4]http://sunsite.unc.edu/LDP/HOWTO/Plug-and-Play-HOWTO.html 即可. 2. PnP 怎麽做: 分配 "资源" 2.1 什麽是 Plug-and-Play (PnP)? Plug-and-Play 就是自动配置(低层)计算机中的插卡和其他设备, 然後告诉对应 的设备都做了什麽. Plug-and-Play 的任务是把物理设备和软件(设备驱动程序) 相配合, 并操作设备, 在每个设备和它的驱动程序之间建立通信通道. 换种说 法, PnP 分配下列资源给设备和硬件: I/O 地址, IRQ, DMA 通道, 内存段. 假如 你不理解这 4 项, 看下面的. 一旦这些资源被分配, 设备(名字在 /dev 目录 中)就准备好被使用(倘若这些物理设备在你的 PC 中). PnP 配置资源, 但仅是一定程度上的配置资源. 尽管使用了 PnP, 许多设备仍不 是被 PnP 来配置. 如调制解调器的配置, 'init string' 被通过 I/O 地址通道 送给调制解调器, 尽管 I/O 地址通道是由 PnP 分配的, 但 'init string' 与 PnP 无关. 设置串口的速度是由用户执行程序来做的而不由 PnP. 所以当说起 PnP 的时候, '资源'意味著资源中的一部分, '配置'意味著某些类型的配置. 2.2 计算机如何找设备(和 反过来) 计算机包括 CPU 来运算, 内存来存储程序和数据. 还有一些设备, 如磁盘驱动 器, 显示卡, 键盘, 网卡, modem 卡, 声卡, 串口和并口, 等等. 还有电源提供 电能, 主板上的各种总线把设备和 CPU 连在一起, 机箱把它们装起来. 过去, 许多设备都是插卡(印刷线路板). 今天, 除了插卡之外, 许多设备已经小 到一块芯片被做在主版上. 主版上的插卡也许包含不止一个设备. 内存有时也被 认为是设备但不是此 HOWTO 中的 plug-and-play. 计算机要正常工作, 每个设备必须在它的驱动程序(它也是操作系统的一部分, 在CPU上运行)控制下运行. 驱动程序与 /dev 目录下的特殊文件联系在一起, 尽 管他们不是真正的文件. 它们有象 hda1, ttyS0, eth1 等这样的名字. 麻烦的是 选择特殊设备的驱动程序, 就说 eth1 吧, 依赖于你使用的网卡的类型. 这样 eht1 就不能分配给除了可以使你安装的网卡正常工作的驱动程序外的其它驱动程 序. 为了控制设备, CPU (在驱动程序的控制下)向设备发送命令和从设备读取信 息. 要这样做, 每个设备驱动程序必须知道设备的接口地址, 比如用于通信的地 址. 知道这样的地址就如同建立了一条通信通道, 即使这个通道是 PC 里的许多 设备共享的数据总线. PC 有 3 类地址空间: 内存, I/O, 和配置(仅限于 PCI 总线). 只有前两个(内 存, I/O)被 PnP 配置. 在 PC 里这3种类型的地址共享同样的总线. (另外: 对于 PCI 总线, 它用于传输数据). 但是由特定电路来告诉设备地址是在 I/O 空间或 在内存空间.(译者注: 其实就是总线控制电路中的内存使能线, 当它为 0 电平 时, 表示当前地址是内存地址, 为 1 电平时, 表示当前地址是 I/O 地址.) 设备 通常使用 I/O 地址空间. 分配 I/O 地址主要有两步. 1. 设置插卡的 I/O 地址,等.(插卡寄存器地址中的一个) 2. 让设备驱动程序知道这些 I/O 地址. 第三步是在 /dev 目录中给设备和它的驱动程序取一个名字, 如 hda, ttyS0, 或 eth1. 前两步就象解决在一条街道上找某人的住宅号码的问题. 你必须知道住宅 号码并且某人必须把号码放在住宅前面, 你才可以找到它. 在计算机中, 驱动程 序必须知道接口地址, 并且硬件必须设置为相同的地址, 当然这些地址应是插卡 寄存器地址中的一个. 这两样都要做, 错误的是有些人仅做了其中一样, 然後却 对计算机找不到设备感到奇怪. 下面解释上面的: [5]IRQ's, [6]DMA 通道 IRQ, DMA 通道, 和 [7]内存地址, 所有这些都叫"资源". 2.3 IRQ's -- 概述 看过下面的简略介绍, 你也许还想看更详细的 [8]中断 -- 详解. 简述: 除了地 址外, 还有中断需要处理(如 IRQ5). 把它叫中断号. 我们在上面已经说过设备驱 动程序为了能通信必须知道插卡的地址. 那麽反过来怎麽办呢? 设备如何与驱动 程序通信呢? 所以设备需要知道驱动程序的地址, 这样设备就可以呼叫驱动程序 了. 例如: 设备接收到一些需要传送到主存的数据, 它需要告诉驱动程序马上来 拿这些数据, 并把数据从设备的缓冲区送到主存. 设备呼叫驱动程序用把一个中断电路连线(总线的一部分)的电平抬高的方法. 有16个这样的连线, 每个连线与一个特定的设备驱动程序关联. 每根连线有一个 特定的 IRQ(Interrupt ReQuest) 号. 设备需要把中断放到恰当的连线上, 并且 驱动程序必须侦听同一连线. 究竟使用哪根连线取决于存贮在设备中的中断号, 此中断号必须被驱动程序知道, 这样它才知道需要侦听那根中断线. 2.4 DMA 通道 DMA 代表 'Direct Memory Access'(直接内存访问). 就是允许设备从 CPU 手中 接管系统总线, 并直接把数据传送到主内存. 通常 CPU 分两步来传送数据: 1. 从设备的 I/O 存储空间读数据, 把数据放在 CPU 内部. 2. CPU 把数据从其内部 送到主内存. DMA 方式通常用一步就可把数据从设备直接送到主内存. 设备硬件 必须内置有这种能力并不是所有的设备都可以使用 DMA 的. 从 DMA 传输占用系 统总线开始的传输过程中 CPU 就不做什麽了. 当一个设备试图进行 DMA 时, 它会发出一个请求(用改变总线的 DMA 请求连线的 电平的方式). DMA 请求也可以用中断的方式来实现, 但会有一定的延时, 所以为 了快速, 就用一种特殊类型的中断 'DMA-请求' 来实现. 象中断一样, 把 'DMA- 请求线' 编号来识别是哪个设备发出的请求. 这些编号就叫 DMA-通道. 因为 DMA 传输使用系统总线(同一时间只能有一个使用), 所以它们实际上用同一个通 道, 编号主要用来识别谁在使用通道. 主板上的硬件寄存器纪录各通道的当前状 态. 要发出一个 DMA 请求, 设备必须知道自己的 DMA 通道号, 通道号由物理设 备存储在自己内部. 2.5 Memory 段 像 I/O 地址一样, 一些设备在主内存中分配有地址. 当你插这样的卡时, 你实际 上也插了一块内存模块(主内存, 不是 I/O 内存). 这段内存被设备和 CPU 共 享(运行设备驱动程序後). 这块内存意味著设备和主内存之间'直接'传输数据. 其实不是真正的传输, 设备把数据放到它自己的内存中同时也就放到了主内存 中. 插卡和设备驱动程序必须知道内存块的地址. 2.6 两种 "资源" 必须把设备驱动程序和他们控制的硬件联系起来. 这由向他们提供相同的资源来 解决. 例如: 串行口使用两个资源: 一个 IRQ 和 一个 I/O 地址. 这些资源必须 提供给设备驱动程序和物理设备两者. 驱动程序(和它的设备)被命名(如 ttlyS1). 地址和 IRQ 号被插卡存储在自己的记忆体中(或主板的一个芯片中). 2.7 问题 PC 体系只提供有限的 IRQ, DMA 通道, I/O 地址,等. 假如只有几种设备并且设 备都使用标准的资源, 把驱动程序和设备联系在一起没什麽问题. 每个设备有一 个固定的资源并且不与机器中的其他设备冲突. 没有两个设备使用相同的 I/O 地 址, IRQ, 等. 编写驱动程序时把这些资源写进去即可. 这样事情就简单了. 但实际情况不是这样. 今天不仅有许多不同的设备且它们极有可能发生冲突, 而 且同时又要使用不只一个同种类型的设备. 例如一个人可能想使用几个不同的磁 盘驱动器, 几个串口, 等等. 所以设备必须有一定的灵活性这样可以把它们设置 为任意的地址, IRQ, 等等. 因为要避开资源冲突. 但是一些 IRQ 和 地址是相当 标准的如时钟和键盘. 它们不需要这样的灵活性. 除了资源冲突之外, 还有一个问题是告诉驱动程序错误的资源信息. 例如: 你根 据猜想在配置文件中输入 IRQ4, 可设备实际使用的是 IRQ5. 这是资源分配的另 一种错误. 资源分配, 如果做的正确, 可以在硬件和它们的驱动程序之间建立通信通道. 例 如, 一个特定的 I/O 地址□围分配给一个设备驱动程序和一块硬件, 那麽就可在 它们之间建立通信通道. 驱动程序可以向设备送命令和信息. 实际上不只一条通 道, 因为驱动程序可用读设备寄存器的方式得到信息. 但是设备不能用这种方式 通信. 分配一个 IRQ, 把它作为驱动程序和设备可以交互的另一条通信通道. 3. Plug-and-Play (PnP) 解决方案 3.1 介绍 PnP 把 PnP 资源自动分配给硬件和对应的软件. 就是, 把设备和它们的驱动程序 配对并建立通信通道. 在使用 PnP 之前, 硬件靠跳线, 软件靠配置文件(或类似 的方法)或猜测硬件使用的资源来分配资源. 这样并不能总是正常工作. 完全的 PnP (也不能总是正常工作), 需要 PnP BIOS 和操作系统的配合. 当计算 机开机时 BIOS 会运行来启动. 假如操作系统存储在硬盘上(通常是这样), 那麽 BIOS 必须了解这个硬盘. 如果硬盘是 PnP 的那麽 BIOS 会使用 PnP 方式找到 它. 同样, 当计算机启动时为了配置 BIOS, 显示卡和键盘时必须的, 所以如果需 要的话 BIOS 必须配置这些设备. 一旦 BIOS 识别了硬盘, 显示卡, 和键盘, 它就准备 'boot'(从硬盘调入操作系 统). 假如你已经告诉 BIOS 你有一个 PnP 的操作系统, 它将做这麽多并让操作 系统完成其馀的 PnP 配置. 否则, PnP-BIOS 将完成剩馀的 PnP 配置. 3.2 Linux 需要 PnP Wintel(Microsoft 和 Intel) 创造了 PnP. 由于种种原因, Linux 社区有人不喜 欢 PnP. 但不管喜欢与否, 今天的硬件大部分是 PnP 的, 除了有效的处理 PnP 外, Linux 别无选择. 3.3 总线问题 PnP 打算在任何总线上运行如 ISA,PCI. ISA 是 IBM PC 上的旧总线结构, PCI 是 Intel 创造的新的快速的总线结构. 最终, ISA 总线将消亡. PCI 总线结构在 总线上保留了许多地址用于 PnP 配置. Linux 使用这些地址来找出你有什麽 PnP PCI 设备并把它们的信息放在 /proc/pci '文件'中. (关于PCI总线上的非 PnP 设备, 我不明白). 对于 ISA 总线, 由于它不是为 PnP 设计的, 设计 ISA 时没有任何 PnP 概念, 所以它上面没有用于 PnP 的 I/O 地址. 结果, 在 ISA 上实现 PnP 相当复杂,它 需要 PnP 设备被指定一个临时的'handle'(句柄)用于 PnP 配置. 分配这些 'handles' 也叫做 'isolation'. 请看附录中关於 [9]Isolation 的复杂描述. 3.4 设置 PnP BIOS 当开机时, BIOS 比操作系统先行调入运行. 新的 BIOS 支持 PnP, 它将设置部分 或所有的 PnP 设备. 对于大多数 PnP BIOS 没有办法抑制 PnP 功能, 你不得不 使用它. 这儿的一些选项,在你的 BIOS 菜单中也许也有: * [10]你有一个 PnP 操作系统吗? * [11]如何分配资源? * [12]重置配置? 你有一个 PnP 操作系统吗? 假如你说'是', PnP BIOS 将用 PnP 设置硬盘, 等. 但让操作系统完成最终配置 任务. BIOS 也许在 ISA 总线上做 [13]Isolation, 然後让操作系统来完成这些 设备的配置. 假如你的操作系统不做这些配置工作(一些 Linux 的补丁版本), 由 于 BIOS 也许会把这些 ISA 设备置为禁止状态(??), 你大概不会说'是'. 假如你说没有, BIOS 会自己做配置工作. 除你增加新的 PnP 设备外, 它将使用 它先前存储在非挥发存储器中的配置. 假如使用的是 Linux, 配置不会有什麽变 化. 假如使用的是 Windows 95/98 (他们是 PnP 的), 它们可能会设置配置不同 于你在 Linux 下的配置. 通常, 你可以在 Linux 启动时运行 isapnp 工具把 ISA 设备设置为你想要的配置. 但这对 PCI 卡没有帮助, 不过你能用看 /proc/pci 文件的方法来检查它们是被如何配置的. 然後你应确保 Linux 中驱动 程序使用的配置文件("setserial", lilo.conf , 等)与此相符. 看 [14]BIOS 配 置 PnP 得到更多的信息. 如何分配资源? 这取决于你决定如何分配 IRQ 和 DMA. 设为 "auto"(自动), BIOS 将分配资源. 如果设为 "manual"(手工), 你可以进入另一个菜单并能为 "legacy" (non-pnp) 卡预留资源. 现在 BIOS 也许或不会知道你的 legacy 卡. 假如知道卡的话, 会 试图使用 "auto". 如果不知道的话, 需要手工为 legacy 卡预留需要的 IRQ, 让 BIOS PnP 配置时不使用这些资源. 假如你在 Windows 下运行 ICU 告诉 BIOS 关 于你的 legacy 卡的情况, BIOS 才会知道你的 legacy 卡的情况. BIOS 会把这 些信息存在它的非挥发存储器中. 重置配置? 这会擦除掉 BIOS 存储在非挥发存贮器中的 PnP 设备和上面讲的 legacy 卡的配 置信息. 除非你确信这些数据有误需要重写, 否则没有必要这样做. 只有你的机 器不能启动时才需要这样做. 假如你的 BIOS 丢失了 legacy 设备的信息, 你需 要在 Windows 下运行 ICA 来重建这些信息. 4. 如何对付 PnP 卡 4.1 介绍 今天, 大部分新的内置插卡是 PnP 的. 其中的一些卡有跳线(或类似的)可以把卡 设置为非 PnP. 因为许多 Linux (和 Dos/Windows)程序可以处理 PnP, 最好保留 卡的 PnP 功能. 假如你把内核升级为支持 PnP, 它不仅会配置硬件而且会把硬件 配置信息提供给驱动程序, 这样你就不需要配置它们了. 例如, 对于串口你就不 必使用 "setserial" 了. 假如你有一块 PnP 卡, 你会有下面一个或多个选项来配置它: * [15]禁用 PnP 用跳线的方法(但许多卡不能)或特殊的软件. * [16]BIOS 配置 PnP (仅用于你有一个 PnP BIOS) * [17]Isapnp 一个用于配置 ISA 总线上 PnP 设备的软件(但不能用于 PCI 总 线设备) * [18]修补 Kernel 把 Linux 转变为一个 PnP 的操作系统 4.2 禁用 PnP ? 许多卡的 PnP 功能无法抑制掉. 即使你有机会这样做, 由于下面的原因你也许不 会这样做. 1. 假如在同台机器上有 MS Windows, 你也许希望在 MS Windows 下可以用 PnP 来做不同的配置. 2. IRQ 等资源有限, 除非使用 PnP, 否则很难配置. 3. 假如需要使用 Dos/Windows 下的软件设置为非 PnP 方式, 可有一天你不能 使用 Dos/Windows 了, 因此很难再改变配置. 4. 你有(或将有)其它 PnP 设配需要配置, 所以你要无论如何都需要 PnP 功 能. 设备一旦被设置为非 PnP 配置方式, 它们将不能被 PnP 软件或 BIOS 配置. (除 非移去跳线或使用配置软件打开 PnP 功能) 4.3 BIOS 配置 PnP 想这样做, 你的 BIOS 必须支持 PnP. 得到关于你的 BIOS 更多的信息, 看有关 的 Web 站点. 一些 BIOS 只有最少的 PnP 功能, 它会试图把困难的配置工作交 给 Windows 工具(在 Linux 下不可能). 在这种情况下如果 BIOS 维护一个配置 数据库的话, 你也需要用 DOS/Windows 下的 ICU 来设置这数据库. 首先设置你的 BIOS 为 ""Not a PnP Operating System"(没有 PnP 的操作系 统). 看 [19]配置 PnP BIOS. 这会使 BIOS 完成全部配置工作, 而不是把剩馀的 交给操作系统. BIOS 的非挥发数据库叫 ESCD (Extended System Configuration Data). 它不仅 存储 PnP 设备的配置并且存储非 PnP 设备的信息用于避开冲突. 当你安装新的 非 PnP 设备应在安装前用ICU(Intel Configuration Utility)告诉 ESCD 关于设 备的信息. 你也需要运行 ICU 告诉 ESCD 关于已经存在机器中的非 PnP 设备的 信息(除非有人已经做过了). ESCD 通常保存在芯片中, 但有时会保存在硬盘上?? (译者想: COMPAQ 的配置信 息有些是否保存在硬盘上) 使用 Linux 操作系统的机器的 BIOS 每次启动时是这 样配置. 你也许想纪录 ICU (和 BIOS)是如何配置的(或打印出来). 然而, 假如 你增加一个新的非 PnP 设备就需要再次运行 ICU. 假如它是 PnP 的, BIOS 会自 动配置它, 并尽量不改变机器中已经存在的设备的配置. 但为了给新设备分配它 需求的资源, 有时不得不改变已有设备的配置. 假如这发生了, 你需要找到什麽 改变了(看 /proc/pci 和使用 "pnpdump"命令)并且做出相应改变. 注意: 在 Dos/Windows 下配置信息还会放在硬盘上的Windows文件中, 这样操作 系统知道每个设备的情况. 对于自动检测设备的 Linux 不会发生这种事情. 4.4 Isapnp 仅用于 ISA 总线上的 PnP 设备. 在启动时运行此程序将按照你在 /etc/isapnp.conf 的设定来配置这些设备.你需要 isapnptools 包, 包含在许多 发行版本中. 输入 "locate pnp" 来查找你是否拥有 isapnp. 假如你的 Linux 自动安装了 isatools, isapnp 也许在启动时已经运行. 对于这种情况, 你需要 做的就是编辑 /etc/isapnp.conf (用 man isapnp.conf 得到有关信息). 因为你 通过编辑配置文件来决定如何设置设备, 这样做有点象手工配置 PnP. 假如这样 使用 "isapnp" 并且有一个 PnP BIOS, 你将告诉 BIOS 你有一个 PnP 的操作系 统吗?? (翻译者认为: 如果你的 Linux 内核不支持 PnP, 回答没有 PnP 操作系 统, 让 BIOS 完成所有的 PnP 设置工作, 但你不要试图去修改设备的资源, 修改 自己的配置文件即可.) 假如你曾经运行 isapnp 配置 ISA-PnP 设备,但每次启动时运行isapnp失败, 那 麽假如你在同台机器上有 Windows 95/98 的话可能会发生: 当使用 Windows 95/98 时, Windows 也许会以不同的方式配置你的 PnP卡, 当你返回使用 Linux 时, 卡就不会正常工作. 4.5 修补核心让 Linux 支持 PnP 有一个巨大的补丁来做这些. 新的核心是稳定的并且包含文档: serial.txt 说明 如何处理串行口. 它在 /proc 目录中提供"文件", 所以你可以知道这些是如何进 行的并能用 echo 命令来设置配置. 一个问题是许多驱动程序不知道这些, 你还 需要使用传统的配置文件, 等. 如何配置, 请看 [20]http://lucifer.hemmet.s-hem.chalmers.se/~dwh 4.6 PnP 软件和文档 * 看 [21]http://www.redhat.com/linux-info/pnp/ 关于 PnP 的软件和文 档. * 看 [22]http://www.microsoft.com/hwdev/respec/pnpspecs.htm 关于 PnP 的特性. 5. 附录 5.1 地址 有三类地址: 主内存地址, I/O 地址和配置地址(仅限于 PCI 总线). "地址"在本 文档中有时表示一个连续的地址范围. 因为地址是以字节方式给出的, 一个单一 地址只包含一个字节, 但 I/O(和主内存)地址包含的比这多. 当分配给设备的地 址较多时, 常用一个地址来表示I/O设备的全部连续地址范围. 如: 对于串行口( 一个 I/O 设备)只给出它占用的八个地址的起始地址, 因为大家都知道此设备用 八个字节的地址. 起始地址叫"基本地址". (翻译者: 上面翻译的东西我回头看看 都不十分明了, 给大家举个例子吧. 我们说某个串口的地址为 3f8, 其实是说它 的地址是从 3f8 开始的八个地址, 因为默认的设备地址□围是八个地址.) 访问I/O和(主内存)地址空间使用的是相同的物理地址总线(在 PC 机中, 它们的 地址总线在硬件上是共享的). 那麽设备如何知道地址总线上的数据表示的是 I/O 地址还是内存地址呢? 其实, 在总线上有四个专用连线来区分地址数据的含 义. 假如这四个连线中的某个起作用, 就表示 CPU 想访问 I/O 地址, 那麽内存 就会忽略总线上的地址信息. 其它三个连线类似用法. 通常, 大多数 I/O 设备仅使用 I/O 存储器与 CPU 通信. 例如, 串行口就是这 样. 设备驱动程序从 I/O 地址中读写数据并且通常情况下把数据放到主内存. 快 一点的方法是设备把数据直接送到主内存. 这样做的一种方法是使用 [23]DMA 通 道. 另一种方法是在主内存中分配一定空间给设备. 这种方法不需借助 DMA 便可 以直接读写主内存. 这样的设备通常有 I/O 地址和主内存地址. 5.2 中断 -- 详述 中断用间接的方式传送信息. 中断信号(线路上的一个电平)告诉中断控制器一个 特定的设备有话要说. 中断控制器再通知 CPU. CPU 会启动"中断服务例程"来处 理. "例程"会试图找出发生什麽了事情并处理象需要传输等问题. "例程"能容易 的找出发生什麽了事情, 因为驱动程序知道设备的寄存器地址. 这些寄存器包含 关于设备的信息. 软件读这些寄存器中的内容并分析它们, 找出发生了什麽, 并 采取适当的行动. 5.3 Isolation 仅用于 ISA 总线. Isolation 是给 ISA 总线上的 PnP 设备分配句柄(id 号)的 复杂的方法. 尽管有更有效的方法(也更复杂)来做这件事, 但有些人认为简单一 点好. 只有一个可以写所有 PnP 设备的写地址, 所以写这个地址就可以告诉所有 正在侦听的PnP设备. 这个写地址用于向各个 PnP 设备送一个唯一的句柄. 分配 句柄要求句柄送到公用地址时只有一个设备在侦听. isolation 有些像一个"游 戏". 用一个公用总线连线连接所有 PnP 设备和 isolation 程序. "游戏"的首次循环, 所有的 PnP 设备监听总线的同时并向总线上发送数据位流. 数据位不是1就是0. 每个 PnP 设备发送自己的编号, 从高位开始, 一位接一位. 假如一个设备发送一个1, 1会被其它所有的设备听到. 假如所有的设备发送 0 那 麽总线上就什麽也听不到. 在首次循环的最後, 除了最高编号的设备外其它设备 都被排除掉了.(所有的编号长度都一样.) 首先考虑的是最高位. 假如一个 PnP 设备发送 0, 可监听到的是 1, 就表示有更 高编号的 PnP 设备存在, 它将临时退出循环不再侦听直到此循环结束(当最大编 号设备被赋予一个句柄时). 现在保留下来的设备有相同的前导位(一个 1), 我们 在未来的处理中把前导位去掉只考虑剩馀的部分. 重新开始循环直到全部编号(所 有设备)都被处理(都是 0 的情况看下面). 假如前导位都是 0 会发生什麽? 所有的设备留在游戏中. 0 会被象 1 一样屏蔽 掉, 开始下一轮循环. 在循环结束时只有最高编号的 PnP 设备会保留下来. 它会得到一个句柄并退出游 戏. 上次循环中被淘汰出局的设备会再次进入游戏开始一个新的循环. 直到所有 设备都有一个句柄. 这样做是很简单的. 设备有了句柄, 就有了向 PnP 设备发送和读取配置信息的地址. 需要注意的是这 些句柄只用于配置 PnP 设备不能用于正常的通信. 当机器启动後, 所有的句柄都 会丢失, 所以每次你启动机器 BIOS 都会做一次这样的工作. References 1. mailto:bf347@lafn.org 2. mailto:rock@371.net 3. http://sunsite.unc.edu/LDP/mirrors.html 4. http://sunsite.unc.edu/LDP/HOWTO/Plug-and-Play-HOWTO.html 5. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#interrupt_over 6. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#dma_ 7. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#mem_ 8. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#interrupt_detail 9. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#isolation_ 10. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#bios_pnp_os 11. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#bios_resources 12. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#bios_reset 13. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#isolation_ 14. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#bios_conf 15. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#disable_pnp 16. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#bios_conf 17. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#isapnp_ 18. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#patch_kernel 19. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#conf_pnp_bios 20. http://lucifer.hemmet.s-hem.chalmers.se/~dwh 21. http://www.redhat.com/linux-info/pnp/ 22. http://www.microsoft.com/hwdev/respec/pnpspecs.htm 23. file://localhost/tmp/zh-sgmltools.2504/Plug-and-Play-HOWTO.txt.html#dma_