下一页 上一页 目录

4. 针对不同内核版本的预编译模块的技巧和窍门

许多 Linmodem 驱动程序仅以预编译的二进制内核模块形式提供。通常,模块/二进制文件只能与它们共同编译的内核透明地工作。因此,使预编译的 Linmodem 驱动程序与您特定的内核一起工作可能是一个挑战。

由于 Linux 内核是一个动态变化的实体,非常不幸的是,许多调制解调器/芯片供应商尚未选择发布其驱动程序的源代码版本,这将确保您和我们能够随着内核源代码的演进而适当地修改这些驱动程序。一些二进制模块已被诱导在一些较新的内核版本下使用各种技巧来运行,如下所述;然而,即使模块可能被渲染为功能性的,也建议尽量少用它们。引用 Mark Spieth 的一封电子邮件:

“如果存在未解析的符号,驱动程序永远无法正常工作,因为这意味着某些东西将无法工作。此外,这意味着原本应该被调用的东西将调用内核中的其他东西,而这可能是任何东西。这是非常糟糕的。”

因此,您在使用与不同内核版本的二进制模块时应谨慎;风险自负。如果您最需要的是调制解调器正常工作,请考虑降级您的内核以匹配模块 - 这绝不是一个荒谬的想法。尽管有这些警告,然而,许多其他人已经使用不匹配的二进制模块和内核,只有轻微的烦恼(例如偶尔的内核崩溃),并使用了如下的技巧和工具。

4.1 Fixscripting (修复脚本)

Mark Spieth 贡献了一系列逐步改进的 “fixscripts”,用于编辑二进制模块,以便消除版本不匹配警告。然后,插入 “fixed” 模块时无需强制标志,即只需 insmod 模块名称。 后期版本还重命名模块符号以匹配内核导出的符号,以便测试 depmod -e 不会返回 “Unresolved symbols” 错误。必须强调的是,此更改几乎完全是表面功夫 - 仍然建议尽量少用该模块。

要在(现已弃用的)二进制 Lucent 模块 ltmodem.o 上使用 fixscript,例如,创建一个工作目录,如 /root/modem。从 http://www.test.dclabs.com.au/linmodem/fixscript 获取最新的 fixscript。将文件保存为 fixscript。用 less 或您最喜欢的文本编辑器查看它,以检查是否意外获取了 DOS 硬停止符。根据您的查看器/编辑器,它们看起来像粗体 M、下划线 M 或 ^M。注意:查看器 more 不显示这些 DOS 换行符。

使用 chmod +x fixscript 使该文件可执行。生成一个 “fixed” 模块,例如:

    ./fixscript ltmodem.o ltmodem2217.o

通过使用以下命令测试模块依赖性,不应产生任何错误:

    depmod -e ltmodem2217.o

并且应该通过简单的、非强制的以下命令成功插入:

    insmod ltmodem2217.o

某些 PCTel 模块提供的 “源代码”(一个小的 C 文件)在与这些软件包中的二进制库编译和链接时,执行类似的伪装;与部分开源的 Lucent 驱动程序不同,它补偿内核接口的任何实际更改。

4.2 补丁 tty.h

为了使原始的、仅二进制的 Lucent LT 调制解调器驱动程序(版本 5.68)在高于 2.2.14 的内核上工作,Mark Spieth 注意到 Linux 内核源代码中的一个简单更改修复了 2.2.14 到 2.2.16 内核版本之间产生的主要不兼容性。当使用部分源代码/二进制 Lucent 驱动程序(版本 5.78)时,此补丁不再是必需的,但对于那些驱动程序是针对 pre-2.2.15 内核编译的其他调制解调器仍然有用。

打过补丁的 2.2.17 tty.h 和一些使用此补丁编译的 2.2.17 内核软件包可从 http://walbran.org/sean/linux/stodolsk/ 获取。如果您想自己进行编辑,则要移动的行位于 include/linux/tty.h 中的 tty_struct 结构中;在较新的内核中,它有一个额外的成员 poll_wait。将此成员移动到结构的底部,以便剩余的偏移量将与 2.2.15 之前的版本中的偏移量相同,从而与预编译的内核模块兼容。在对源代码进行此更改后,您将需要重新编译您的内核和模块。

4.3 使用来自 Kernel 2.2.14 的 ppp.o

存在一种技巧,可以在高于 2.2.15 的内核中使用二进制模块,而无需重新编译内核;然而,在发现上面描述的 tty.h 补丁之后,此技巧不再是必需的,也不再推荐使用。该技巧是用来自内核 2.2.14 的模块替换 /lib/modules/net/ppp.o 模块。Christoph Hebeisen (cth(at)sfu.ca) 报告说,与 Lucent 模块一起使用 ppp.o 版本 2.2.14 而不是版本 2.2.16 在 2.2.16 内核下提供了功能。Willie Green (willjr(at)lcc.net) 证实,此技巧也适用于 ESS 模块。在简单插入支持的版本匹配的模块之后

    insmod slhc
来自 2.2.14 源代码的不匹配的 ppp.o 被插入
    insmod -f ppp.o 
我们希望强调,与上述对内核源文件 tty.h 的简单而更有效的更改相比,这种强制插入的技巧稳定性较差。


下一页 上一页 目录