📄 plug-and-play-howto.txt
字号:
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/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#interrupt_over 6. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#dma_ 7. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#mem_ 8. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#interrupt_detail 9. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#isolation_ 10. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#bios_pnp_os 11. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#bios_resources 12. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#bios_reset 13. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#isolation_ 14. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#bios_conf 15. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#disable_pnp 16. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#bios_conf 17. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#isapnp_ 18. file://localhost/tmp/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#patch_kernel 19. file://localhost/tmp/bg5sgmltools.6270/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/bg5sgmltools.6270/Plug-and-Play-HOWTO.txt.html#dma_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -