下一页 上一页 目录

3. 解决安装和配置问题

本节描述了 PCMCIA 子系统一些最常见的故障模式。尝试将您的症状与示例进行匹配。本节仅描述不特定于特定客户端驱动程序或卡类型的常见故障。

在尝试诊断问题之前,您必须知道系统日志的保存位置(请参阅关于特定 Linux 发行版的说明)。您还应该熟悉基本的诊断工具,如 dmesglsmod。此外,请注意,大多数驱动程序组件(包括所有内核模块)都有自己的独立手册页。

在 3.1.15 及更高版本中,PCMCIA 源代码树的 debug-tools 子目录中有一些脚本,可以帮助诊断一些最常见的配置问题。test_setup 脚本检查您的 PCMCIA 安装是否完整。test_networktest_modem 脚本将尝试诊断 PCMCIA 网络卡和调制解调器卡的问题。如果您不熟悉 Linux 并且不确定如何解决问题,这些脚本会特别有帮助。

尝试尽可能精确地定义您的问题。如果您有多张卡,请分别尝试每张卡,以及不同的组合。尝试冷启动 Linux,以及从 Windows 热启动。比较启动时插入卡,以及启动后插入卡。如果您通常在笔记本电脑连接底座时使用,请尝试在未连接底座时使用。有时,两个插槽的行为会有所不同。

为了调试设备配置脚本中的问题,使用 ``-v'' 选项启动 cardmgr 可能会很有用。对于 3.1.23 或更高版本的 PCMCIA 软件包,这将导致大多数重要的脚本操作记录在系统日志中。

尝试通过 PCMCIA 设备安装 Linux 时遇到的驱动程序问题几乎不可能调试。即使您可以根据症状识别问题,安装盘也很难修改,尤其是在无法访问正在运行的 Linux 系统的情况下。安装盘的自定义完全取决于 Linux 发行版的选择,并且超出了本文档的范围。一般来说,最好的做法是使用其他方式安装 Linux,获取最新的驱动程序,然后在问题仍然存在时进行调试。

3.1 基本 PCMCIA 内核模块未加载

症状

内核模块包含版本信息,模块加载时会针对当前内核检查这些信息。检查类型取决于 CONFIG_MODVERSIONS 内核选项的设置。如果此选项为 false,则内核版本号会被编译到每个模块中,并且 insmod 会检查它是否与正在运行的内核匹配。如果 CONFIG_MODVERSIONS 为 true,则内核导出的每个符号都会被赋予一种校验和。这些代码都会与编译到模块中的相应代码进行比较。这样做的目的是使模块对版本的依赖性降低,因为只有在内核接口发生更改时校验和才会更改,并且通常会在次要内核更新中保持不变。但在实践中,校验和反而更具限制性,因为许多内核接口都依赖于编译时内核选项设置。此外,事实证明,校验和对兼容性的判断过于悲观。

实际结果是,内核模块与内核版本以及许多内核配置选项的设置紧密相关。一般来说,为某个 2.2.19 内核编译的一组模块不会加载到另一个 2.2.19 内核上,除非特别注意确保两者使用相似的配置构建。这使得预编译内核模块的发布成为一项棘手的业务。

您有以下几个选项

3.2 一些客户端驱动程序模块未加载

症状

一些驱动程序模块需要内核服务,这些服务可能存在也可能不存在,具体取决于内核配置。例如,SCSI 卡驱动程序要求内核配置了 SCSI 支持,而网络驱动程序需要网络内核。如果内核缺少必要的功能,insmod 可能会报告未定义的符号并拒绝加载特定模块。请注意,insmod 错误消息不区分版本不匹配错误和缺少符号错误。

具体来说

有两种方法可以继续

/etc/pcmcia/config 文件可以指定需要为特定客户端加载的其他模块。例如,对于串行驱动程序,可以使用

device "serial_cs"
  class "serial" module "misc/serial", "serial_cs"

模块路径是相对于当前内核版本的顶层模块目录指定的;如果未给出相对路径,则路径默认为 pcmcia 子目录。

3.3 ISA 中断扫描失败

症状

在识别主机控制器类型后,套接字驱动程序会探测空闲的 ISA 总线中断。探测包括为每个看似空闲的中断编程控制器,然后生成一个“软”中断,以查看是否可以正确检测到该中断。在某些 cases, 探测特定中断可能会干扰另一个系统设备。

探测的原因是识别那些看似空闲的中断(即,未被任何其他 Linux 设备驱动程序保留),但要么未物理连接到主机控制器,要么连接到没有驱动程序的另一个设备。

在系统日志中,成功的探测可能如下所示

Intel PCIC probe:
  TI 1130 CardBus at mem 0x10211000, 2 sockets
  ...
  ISA irqs (scanned) = 5,7,9,10 status change on irq 10

有两种方法可以继续

在任何一种情况下,都可以使用 PCMCIA 启动脚本中的 PCIC_OPTS 定义来指定探测选项,例如

PCIC_OPTS="irq_list=5,9,10"

应该注意的是,在诊断中断探测问题时,/proc/interrupts 完全没用。探测足够明智,永远不会尝试使用已被另一个 Linux 驱动程序使用的中断。因此,PCMCIA 驱动程序已经使用了 /proc/interrupts 中的所有信息。根据系统设计,即使设备处于非活动状态,如果为 PCMCIA 探测它,仍然可能占用中断并引起麻烦。

3.4 IO 端口扫描失败

症状

cardmgr 处理 /etc/pcmcia/config.opts 中列出的 IO 端口范围时,内核会探测这些范围以检测占用 IO 空间但未与 Linux 驱动程序关联的潜在设备。探测是只读的,但在极少数 cases, 从设备读取可能会干扰重要的系统功能,从而导致锁定。

您的系统用户指南可能包含系统设备映射,显示其 IO 和内存范围。这些可以在 config.opts 中显式排除。

或者,如果探测在您的系统上不可靠,可以通过将 CORE_OPTS 设置为 ``probe_io=0'' 来禁用它。在这种情况下,您应该非常小心,仅在 config.opts 中指定真正可用的端口范围,而不是使用默认设置。

3.5 内存探测失败

症状

或者,或者

核心模块在首次插入 16 位卡时执行内存扫描。此扫描可能会干扰其他内存映射设备。此外,3.0.0 之前的驱动程序包执行的扫描比更新的驱动程序更具侵略性。内存窗口在 /etc/pcmcia/config.opts 中定义。默认窗口很大,因此将扫描限制在较窄的范围内可能会有所帮助。可以尝试的合理范围包括 0xd0000-0xdffff、0xc0000-0xcffff、0xc8000-0xcffff 或 0xd8000-0xdffff。

如果您有 DOS 或 Windows PCMCIA 驱动程序,您或许可以推断出这些驱动程序使用的内存区域。请注意,DOS 内存地址通常以“段”形式指定,这会省略最后一个十六进制数字(因此,绝对地址 0xd0000 可能表示为 0xd000)。在更改 config.opts 时,请务必添加回额外的数字。

更改影响设备映射方式的 BIOS 设置有时可能很有用。尝试更改 BIOS 阴影或“即插即用操作系统支持”的设置。

在不常见的 cases, 内存探测失败可能表明主机控制器的时序寄存器设置存在问题。有关处理常见时序问题的信息,请参阅启动选项部分。这实际上只适用于 ISA 到 PCMCIA 总线桥接器。

CardBus 桥接器可以在 ISA 总线架构中的 640KB-1MB “内存空洞”之外分配内存窗口。通常,最好将 CardBus 桥接器配置为使用高内存窗口,因为这些窗口不太可能与其他设备冲突。此外,CardBus 卡可能需要较大的内存窗口,这可能很难或不可能放入低内存中。如果 config.opts 中同时定义了低内存窗口和高内存窗口,Card Services 将优先在高内存中为 CardBus 桥接器分配窗口。默认的 config.opts 包括几个候选的高内存窗口,其中一个在大多数情况下都可以工作。

3.6 未能检测到卡插入和移除

症状

在大多数 cases, 套接字驱动程序(i82365tcic)将自动探测并选择适当的中断来指示卡状态更改。自动中断探测在某些 Intel 兼容控制器上不起作用,包括 Cirrus 芯片和某些 IBM ThinkPad 中使用的芯片。如果设备在探测时处于非活动状态,则其中断也可能显示为可用。在这些 cases, 套接字驱动程序可能会选择被另一个设备使用的中断。

对于 i82365tcic 驱动程序,可以使用 irq_list 选项来限制将要测试的中断。此列表限制了 PCMCIA 卡可以使用的中断集,以及用于监视卡状态更改的中断集。cs_irq 选项也可以用于显式设置用于监视卡状态更改的中断。

如果您找不到可用的中断号,还有一种轮询状态模式:i82365tcic 都接受 poll_interval=100 选项,以每秒轮询一次卡状态更改。如果您的系统可用于 PCMCIA 卡的中断短缺,也应使用此选项。特别是对于具有多个主机控制器的系统,专门使用中断来监视卡状态更改意义不大。

所有这些选项都应在 PCIC_OPTS= 行中设置,位于 /etc/rc.d/rc.pcmcia/etc/sysconfig/pcmcia 中,具体取决于您的站点设置。

3.7 中断传递问题

症状

最简单的中断传递问题是由于与其他系统设备冲突造成的。这些通常可以通过在 /etc/pcmcia/config.opts 中排除问题中断来解决。要测试,只需逐个排除中断,直到问题得到解决或您用完中断。如果所有中断都不起作用,那么设备冲突可能不是问题所在。

对于 CardBus 桥接器,可能会出现各种其他中断传递问题。有关完整讨论,请参阅PCI 中断传递问题

3.8 系统资源匮乏

症状

中断匮乏通常表明中断探测存在问题(请参阅中断扫描失败)。在某些 cases, 探测似乎可以工作,但只报告一个或两个可用的中断。检查您的系统日志,看看扫描结果是否合理。禁用探测并手动选择中断应该会有所帮助。

如果中断探测工作不正常,即使中断太少不适合这样做,套接字驱动程序也可能会分配一个中断来监视卡插入。您可以通过将 PCIC_OPTS 设置为 ``poll_interval=100'' 将控制器切换到轮询模式。或者,如果您有 CardBus 控制器和旧版本的 PCMCIA 驱动程序,请尝试 ``pci_csc=1'',它会选择一个 PCI 中断(如果可用)用于卡状态更改。

在某些 cases, 内核配置错误也可能导致明显的中断短缺。在 2.4 及更高版本的内核上,如果未启用 CONFIG_ISA,则 PCMCIA 驱动程序将假定没有可用的 ISA 总线中断。

IO 端口匮乏不太常见,但有时发生在需要大片连续、对齐的 IO 端口空间区域,或者仅识别少数特定 IO 端口位置的卡上。/etc/pcmcia/config.opts 中的默认 IO 端口范围通常足够,但可以扩展。如果这是问题所在,请尝试取消注释 config.opts 中的 ``include port 0x1000-0x17ff'' 行。在极少数 cases, 匮乏可能表明 IO 端口探测失败(请参阅IO 端口扫描失败)。

使用 config.opts 中的默认内存窗口设置,内存匮乏也不常见。CardBus 卡可能比典型的 16 位卡需要更大的内存区域。由于 CardBus 内存窗口可以映射到主机 PCI 地址空间中的任何位置(而不仅仅是 PC 系统中的 640K-1MB “空洞”中),因此在高内存中指定大内存窗口很有帮助,例如 0xa0000000-0xa0ffffff。

3.9 仅在插入两张卡时出现资源冲突

症状

这通常表明与 Linux 不知道的系统设备存在资源冲突。PCMCIA 设备是动态配置的,因此,例如,中断是根据需要分配的,而不是专门分配给特定卡或插槽。给定一个看似可用的资源列表,卡会按照配置顺序分配资源。在这种情况下,最后配置的卡被分配了一个实际上并不空闲的资源。

检查系统日志,查看无法工作的卡使用了哪些资源。在 /etc/pcmcia/config.opts 中排除这些资源,并重新启动 cardmgr 守护程序以重新加载资源数据库。

3.10 设备配置未完成

症状

这表明卡已成功识别,但是,cardmgr 由于某种原因无法完成配置过程。最可能的原因是卡设置脚本中的某个步骤被阻止。一个很好的例子是,如果插入了没有实际网络连接的网络卡,则网络脚本会阻塞。

要查明问题所在,您可以手动运行设置脚本以查看它在哪里阻塞。脚本位于 /etc/pcmcia 目录中。它们接受两个参数:设备名称和操作。cardmgr 守护程序在系统日志中记录配置命令。例如,如果系统日志显示命令 ``./network start eth0'' 是 cardmgr 执行的最后一个命令,则以下命令将跟踪脚本

sh -x /etc/pcmcia/network start eth0


下一页 上一页 目录