Linux カーネルモジュールのデバッグについて

Linux カーネルモジュールには、カーネルの機能を拡張する方法が用意されており、通常はデバイスやファイルシステムドライバなどに使用されます。 モジュールはカーネル内に組み込むか、またはロード可能なモジュールとしてコンパイルすることができます。その後は、カーネルを頻繁にコンパイルしなくても、開発時に実行中のカーネルからダイナミックに挿入および削除できます。 ただし、モジュールによってはカーネルに組込む必要があり、ダイナミックなロードに適さないものがあります。 組み込みモジュールの例としては、カーネルのブート時に必要であり、ルトファイルシステムを取り付ける前に使用可能でなければならないものがあります。

デバッグ情報がデバッガにロードされていれば、ソースレベルのブレークポイントをモジュールに設定できます。 カーネルにモジュールを挿入する前にモジュールにブレークポイントを設定しようとすると、ブレークポイントが保留されます。

モジュールをデバッグするときは、ターゲット上のモジュールとホスト上のモジュールが同じであることを確認する必要があります。 コードレイアウトは同じでなければなりませんが、ターゲット上のモジュールにはデバッグ情報は不要です。

Show/hide組み込みモジュール

カーネルに組み込まれているモジュールをデバッグする場合の手順は、カーネル自体をデバッグする場合の手順と同じです。

  1. カーネルをモジュールとともにコンパイルします。

  2. カーネルイメージをターゲットにロードします。

  3. 関連するカーネルイメージとデバッグ情報をデバッガにロードします。

  4. 他のカーネルコードと同じようにモジュールをデバッグします。

組み込み(静的リンク)モジュールは残りのカーネルコードと区別できません。そのため、info os-modules コマンドによって表示されず、モジュールビューにも表示されません。

Show/hideロード可能なモジュール

ロード可能なカーネルモジュールをデバッグする手順はより複雑です。 Linux ターミナルシェルから insmod および rmmod コマンドを使用して、モジュールの挿入および削除を行うことができます。 カーネルとロード可能なモジュールの両方のデバッグ情報をデバッにロードする必要があります。 モジュールを挿入および削除すると、デバッガはデバッグ情報と既存のブレークポイントのメモリ位置を自動的解決します。 これを行う場合、デバッガはカーネル内の呼び出しをインターセプトして、モジュールを挿入または削除します。 これにより、アションのたびにわずかな遅延が発生し、その間デバッガはカーネルを停止してさまざまなデータ構造を調べます。 ロード可能なカーネルモジュルのデバッグの詳細については、『DS-5 スタートガイド』のチュートリアルを参照して下さい。

Note

ロード可能なモジュールを検出するには、デバッガ内で接続が確立しており、オペレーティングシステム(OS)サポートが有効になっている必要があります。 Linux カーネルイメージがデバッガにロードされると、OS サポートは自動的に有効になります ただし、set os コマンドを使用して手動でこれを制御することもできます。

Show/hide関連項目

Copyright © 2010-2012 ARM. All rights reserved.ARM DUI 0446IJ
Non-ConfidentialID051512