次のページ 前のページ 目次へ

4. 異なるカーネルバージョンでコンパイルされているモジュールのための Tips とトリック

このドキュメントを書いている時点で、ソースコードが入手できるのは Ambient Technology ドライバと Lucent LT モデム用の部分的なソースだけです。 一般的にモジュール/バイナリは、それらがコンパイルされたバージョンのカーネ ルのときだけ、素直に動作します。従ってコンパイル済みの linmodem ドライバを 特定のカーネルで動くようにするということは難問です。

Linux カーネルは動的に変化する獣なので、ほとんどのモデムとチップのベンダー が依然として彼らのドライバのソースコード・バージョン(これは改良された Linux カーネルを使うために、これらのドライバを修正し再コンパイルする能力を保証 します)をリリースするほうを選ばないことは非常に残念です。 以下に述べるように色々なトリックを使って、少し新しいカーネル・バージョンで 動作するようになだめたバイナリ・モジュールがいくつかあります。 しかし、モジュールが動作するとしても、それは最小限で使用するのが賢明です。 Mark Spieth からの Eメールを引用します。

「unresolved symbols(未解決のシンボル)があると、ドライバが適切に動作する ことはあり得ません。未解決シンボルは、何かが動作しないということを意味して いるからです。さらにこれは、本来呼ばれるべきものの代わりに、カーネル内部に ある別の何かが呼ばれてしまうことを意味しており、実際になにが呼ばれるのかは わからないのです。これはたいへん良くないことです」

ですから、異なるバージョンのカーネルでのバイナリモジュールの使用は相当慎重に するべきであり、自分自身の責任で行って下さい。モデム機能の全てが必要なら モジュールに適合するカーネルにダウングレードすることを考慮して下さい。 これは決してばかげた期待ではありません。 しかし、これらのワーニングにもかかわらず、他の多くは以下のようなトリックと ツールを使って、ささいな不快感(時々起きるカーネルパニックのような)のみで 不一致のバイナリモジュールとカーネルを使用しています。

4.1 Fixscripting

Mark Spieth は、進歩的に改良された "fixscripts" のシリーズに貢献しています。 これは、バイナリ・モジュールを編集するスクリプトで、バージョン不一致のワー ニングを出ないようにします。 これは、強制フラグなしで(つまり単に "insmod モジュール名" とするだけで) "fix された" モジュールを挿入できます。 新しいバージョンでは、モジュールシンボルをカーネルによってエクスポートされ たものに適合するようにリネームもするので、depmod -e でテストしても "Unresolved symbols" のエラーは出ません。 ただし、この変更は単なる隠蔽にすぎないことは強調しておく必要があるでしょう。 このモジュールは最小限の使用に留めておくことを推奨します。

fixscript を使うには、例えばバイナリの Lucent モジュール ltmodem.o の場合 /root/modem のような作業用ディレクトリを作ります。 http://www.test.dclabs.com.au/linmodem/fixscript から最新の fixscript を入手して下さい。 fixscript というファイル名でセーブして下さい。 そのファイルを less コマンドまたはお好みのエディタで、DOS の改行 コードが偶然に入り込んでいないかチェックして下さい。 それらはビューア/エディタに応じて、ボールド(太字)の M, 下線付きの M, ^M のように表示されます。 注意:ビューアの moreでは、これらの DOS の改行文字は表示されません。

chmod +x fixscript で、ファイルを実行可能にします。 "fix された"モジュールを次のようにして作ります。

    ./fixscript ltmodem.o ltmodem2217.o

下記のようにモジュールの依存性をテストするとエラーは出ないはずです。

    depmod -e ltmodem2217.o

そして強制することなくシンプルなコマンドで挿入に成功するはずです。

    insmod ltmodem2217.o

いくつかの PCTel モジュールで提供されている「ソースコード」(小さな C の ファイル)は、コンパイルされてそのパッケージ内のバイナリライブラリとリンク されると、同様の仮装をします。 部分的オープンソースの Lucent ドライバとは異なり、これはカーネルインタフェ ースを実際に変更することを補償するものでは ありません

4.2 tty.h のパッチ

Mark Spieth は、バイナリのみの Lucent LT モデムドライバ (version 5.68) を、オリジナルのまま 2.2.14 以降のカーネルで動作させる方法を探るうち、 Linux カーネルソースをちょっと変更すれば、カーネルバージョン 2.2.14 から 2.2.16 間で生じる非互換性の主要な部分が解決できることに気がつきました。 このパッチは、部分的なソース/バイナリ Lucent ドライバ (version 5.78)を使用 する場合は不要ですが、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 カーネル 2.2.14 から ppp.o を使う

2.2.15 以降のカーネルでバイナリモジュールを使うためのトリックが存在します。 これはカーネルを再コンパイルをする必要がありません。しかし、上で述べた tty.h パッチの発見に従えば、このトリックは必要ではなく、またお勧め しません。トリックは、/lib/modules/net/ppp.o モジュールをカーネル 2.2.14 のものと置き換えます。Christoph Hebeisen (cth(at)sfu.ca) は、 バージョン 2.2.16 ではなく ppp.o バージョン 2.2.14 で Lucent モジュールを 使用すると、2.2.16 カーネルの下での機能を提供すると報告しています。 Willie Green (willjr(at)lcc.net) は、このトリックが ESS モジュールでも働く ことを確認しています。 バージョンが一致するモジュールをサポートする単純な挿入:

    insmod slhc
をしてから、2.2.14 ソースからの一致しない ppp.o を挿入します。
    insmod -f ppp.o 
強制的な挿入での、このトリックは上で述べた簡単でより効果的なカーネルソース ファイル tty.h の変更よりも安定ではないことを強調したいと思います。


次のページ 前のページ 目次へ