Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

kmdb カーネルデバッガの使用

    kmdb デバッガは対話型のカーネルデバッガであり、次の機能を提供します。

  • カーネル実行の制御

  • カーネル状態の検査

  • コードのライブ変更

このセクションでは、ユーザーがすでに kmdb デバッガについて精通していることを前提にしています。このセクションの重点は、デバイスドライバの設計時に役立つ kmdb 機能にあります。kmdb の使用方法について詳しく学ぶには、 kmdb(1) のマニュアルページとOracle Solaris Modular Debugger Guide を参照してください。kadb に精通している場合は、 kadb(1M) のマニュアルページを参照し、kadbkmdb の主な違いを確認してください。

kmdb デバッガのロードやアンロードは、任意で実行できます。kmdb のロードやアンロードの手順については、『Oracle Solaris モジューラデバッガ』を参照してください。安全性と利便性の観点から、代替カーネルでのブートを強くお勧めします。このセクションで説明するように、ブート処理は SPARC プラットフォームと x86 プラットフォームとでわずかに異なります。


注 - kmdb はデフォルトで、kmdb の実行中のプロンプトとして CPU ID を使用します。この章の例では、特に明記されていないかぎり、[0] をプロンプトとして使用しています。

SPARC プラットフォームでの代替カーネルを使用した kmdb のブート

kmdb と代替カーネルの両方を使用して SPARC システムをブートするには、次のいずれかのコマンドを使用します。

boot kmdb -D kernel.test/sparcv9/unix 
boot kernel.test/sparcv9/unix -k

x86 プラットフォームでの代替カーネルを使用した kmdb のブート

kmdb と代替カーネルの両方を使用して x86 システムをブートするには、次のいずれかのコマンドを使用します。

b kmdb -D kernel.test/unix 
b kernel.test/unix -k

kmdb でのブレークポイントの設定

ブレークポイントを設定するには、次の例に示すように bp コマンドを使用します。

使用例 23-5  kmdb での標準ブレークポイントの設定
[0]> myModule`myBreakpointLocation::bp
        

ターゲットモジュールがロードされていない場合、この状態を示すエラーメッセージが表示され、ブレークポイントは作成されません。この場合には遅延ブレークポイントを使用できます。遅延ブレークポイントは、指定されたモジュールがロードされた時点で自動的に有効になります。遅延ブレークポイントを設定するには、bp コマンドのあとにターゲット位置を指定します。次に遅延ブレークポイントの例を示します。

使用例 23-6  kmdb での遅延ブレークポイントの設定
[0]>::bp myModule`myBreakpointLocation       

ブレークポイントの使用方法の詳細については、『Oracle Solaris モジューラデバッガ』を参照してください。次の 2 つの行のいずれかを入力してもヘルプが得られます。

> ::help bp
> ::bp dcmd

ドライバ開発者向けの kmdb マクロ

kmdb(1M) デバッガでサポートされているマクロを使用すると、カーネルデータ構造体を表示できます。kmdb のマクロを表示するには $M を使用します。マクロは次の形式で使用します。

[ address ] $<macroname

注 - これらのマクロから表示される情報もその表示形式も、インタフェースの一部ではありません。したがって、その情報と形式は常に変更される可能性があります。

次の表に含まれる kmdb マクロは、デバイスドライバの開発者に特に役立ちます。便宜上、該当する場合は旧バージョンのマクロ名も示します。

表 23-1  kmdb マクロ
dcmd
旧バージョンのマクロ
説明
::devinfo
devinfo
devinfo_brief
devinfo.prop
あるデバイスノードのサマリーを出力します
::walk devinfo_parents
devinfo.parent
デバイスノードの上位ノードを調査します
::walk devinfo_sibling
devinfo.sibling
あるデバイスノードの兄弟ノードを調査します
::minornodes
devinfo.minor
指定されたデバイスノードに対応するマイナーノードを出力します
::major2name
指定されたデバイスノードにバインドされたデバイスの名前を出力します。
::devbindings
指定されたデバイスノードまたはメジャー番号にバインドされたデバイスノードを出力します。

::devinfo dcmd で表示されるノード状態は、次のいずれかの値を取ります。

DS_ATTACHED

ドライバの attach (9E) ルーチンが正常に復帰しました。

DS_BOUND

このノードはドライバにバインドされていますが、ドライバの probe(9E) ルーチンがまだ呼び出されていません。

DS_INITIALIZED

親のネクサスがドライバ用のバスアドレスを割り当てました。実装に固有の初期化が完了しています。ドライバの probe(9E) ルーチンは、現時点でまだ呼び出されていません。

DS_LINKED

このデバイスノードがカーネルのデバイスツリー内にリンクされましたが、システムはまだこのノードのドライバを検出していません。

DS_PROBED

ドライバの probe(9E) ルーチンが正常に復帰しました。

DS_READY

このデバイスは完全に構成されています。