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

5. デバッグのヒントとプログラム情報

5.1 有益なバグレポートを送るには?

以下に示すものは全てのバグレポートに必ず書いてほしいことです:

既につぶしたバグに関するリポートを読まされるのはあまり生産的ではないの で、バグレポートを送る前に最新のドライバを使っているかどうか確認してく ださるようお願いします。

もしカーネル自身がエラーを起す(fault)するようなら、問題となるアドレス、 EIP、を特定するためにはレジスタのダンプ情報しか役に立たないでしょう。 もしそのアドレスがカーネル本体をさしていれば、System.map を参 照して、どの関数でエラーが起きたのか調べてください。もし実行時ロードモ ジュールでエラーが起きていれば追及するのは多少難しくなります。モジュー ル用ツールの ``ksyms -m'' で各ロード可能モジュールのベースア ドレスがわかります。各モジュールのアドレスから EIP アドレスを含んでい るモジュールを選び、モジュール内部の offset 分を求めるために EIP から ベースアドレスを引きます。そして、gdb をそのモジュールに対して使い、 list コマンドを使って問題となるオフセットのあたりを調べます。 ただし、この方法は-g オプションを使ってデバッグ情報を含むよう にモジュールをコンパイルした時しか使えません。

バグレポートは dhinds@allegro.stanford.edu まで送ってください。 バグレポートは e-mail でお願いします。自宅や職場に電話しないでください。 バグレポートは WWW 経由でも報告できます。詳しくは http://hyper.stanford.edu/~dhinds/pcmcia/pcmcia.html をご覧く ださい。

5.2 PCMCIA の低レベルデバッギング情報

PCMCIA モジュールにはコンパイル時のオプションで決まるデバッグ用コード が多数含まれています。 これらのコードの大部分はプリプロセッサの PCMCIA_DEBUG という定義でコントロールされています。もし PCMCIA_DEBUG が未定義ならば、デバッグ用のコードはコンパイルさ れません。もし 0 に定義されていれば、コードはコンパイルされるものの、 利用されません。この数字を大きくすればデバッグメッセージはより細かくな ります。PCMCIA_DEBUG を定義してコンパイルした各モジュールには pc_debug という整数変数が設定され、この変数でデバッグ出力の詳 しさを制御できます。この変数はモジュールがロードされる際に調整可能で、 再コンパイルしなくてもモジュール毎にデバッグ出力を変更することが可能で す。

PCMCIA パッケージの debug_tools/ ディレクトリには、デバッグ用 のツールが入っています。dump_tcicdump_i365 コマ ンドは PCMCIA コントローラーのレジスタを全てダンプし、多数のレジスタ情 報をデコードします。これらのコントローラーチップのデータシートが利用で きるなら、この情報は非常に有効でしょう。dump_tuples コマンド は、カードの CIS(Card Information Structure) を示し、いくつかの重要な ビットをデコードします。dump_cisreg コマンドはカードのローカ ルな設定レジスタを示します。

メモリカードドライバである pcmem_cs もデバッグに利用できます。 このドライバはどんな PCMCIA カードにも利用でき、他のドライバと干渉する ことはありません。このドライバを使えば、どんなカードの属性メモリや共通 メモリにも直接アクセスできます。

5.3 カード X 用のドライバを書くには?

``Linux PCMCIA Programmer's Guid'' が Linux 用の PCMCIA インタフェース に関する最善の文書です。最新版は、hyper.stanford.edu/pub/pcmcia/doc にあります。

使いたいデバイスが普通の ISA デバイスによく似ていれば、既存の Linux 用 のドライバの一部を流用することもできるでしょう。多くの場合、既存のドラ イバを修正してブート後にもデバイスを追加したり外したりできるようにする のがもっとも苦労するところです。今あるドライバの中では、メモリカード用 のドライバが、あらゆる種類の汚れ仕事をするのにカーネルの他の部分を利用 しない唯一の ``自己完結した'' ドライバです。

ドライバがカードサービス・システムとどのように通信するかを説明するため に、多数のコメントを入れたドライバのヒナ型を作りました。 modules/skeleton.c がそれです。ドライバを作成する際の参考にしてください。


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