JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
デバイスドライバの記述     Oracle Solaris 10 8/11 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

パート I Solaris プラットフォーム用デバイスドライバの設計

1.  Solaris デバイスドライバの概要

2.  Solaris カーネルとデバイスツリー

3.  マルチスレッド

4.  プロパティー

5.  イベントの管理とタスクのキュー

6.  ドライバの自動設定

7.  デバイスアクセス: プログラム式入出力

8.  割り込みハンドラ

9.  ダイレクトメモリーアクセス (DMA)

10.  デバイスメモリーおよびカーネルメモリーのマッピング

11.  デバイスコンテキスト管理

12.  電源管理

13.  Solaris ドライバの強化

14.  階層化ドライバインタフェース (LDI)

パート II 特定の種類のデバイスドライバの設計

15.  文字デバイスのドライバ

16.  ブロックデバイスのドライバ

17.  SCSI ターゲットドライバ

18.  SCSI ホストバスアダプタドライバ

19.  ネットワークデバイスのドライバ

20.  USB ドライバ

パート III デバイスドライバの構築

21.  ドライバのコンパイル、ロード、パッケージ化、およびテスト

22.  デバイスドライバのデバッグ、テスト、およびチューニング

ドライバのテスト

ハードハングを避けるためのデッドマン機能の有効化

シリアル接続を使用したテスト

tip 接続用にホストシステムを設定するには

SPARC プラットフォームのターゲットシステムの設定

x86 プラットフォーム上のターゲットシステムの設定

テストモジュールの設定

カーネル変数の設定

テストモジュールのロードとアンロード

kmem_flags デバッグフラグの設定

テストシステムでのデータ損失の回避

重要なシステムファイルをバックアップする

代替カーネルでブートするには

代替バックアップ計画の検討

システムクラッシュダンプの取得

デバイスディレクトリの復旧

デバッグツール

事後デバッグ

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

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

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

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

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

mdb モジュラーデバッガの使用

モジュラーデバッガの使用開始

kmdbmdb を使用した便利なデバッグタスク

kmdb によるシステムレジスタの調査

カーネルメモリーリークの検出

mdb を使用したデバッガコマンドの記述

カーネルデータ構造体情報の取得

デバイスツリー情報の取得

ドライバのソフト状態情報の取得

カーネル変数の変更

ドライバのチューニング

カーネル統計

カーネル統計構造体のメンバー

カーネル統計構造体

カーネル統計関数

Solaris Ethernet ドライバのカーネル統計

動的計測を行うための DTrace

23.  推奨されるコーティング方法

パート IV 付録

A.  ハードウェアの概要

B.  Solaris DDI/DKI サービスの概要

C.  64 ビットデバイスドライバの準備

D.  コンソールフレームバッファードライバ

索引

ドライバのチューニング

Solaris OS には、ユーザーがドライバのカウンタを実装できるように、カーネル統計構造体が用意されています。DTrace 機能を使用すると、パフォーマンスの解析をリアルタイムで行えます。この節で説明するデバイスのパフォーマンスに関するトピックは、次のとおりです。

カーネル統計

パフォーマンスチューニングを支援するため、Solaris カーネルには kstat(3KSTAT) 機能が用意されています。kstat 機能が提供する一連の関数やデータ構造体を使用すると、デバイスドライバなどのカーネルモジュールからモジュール固有のカーネル統計をエクスポートできます。

kstat は、デバイスの使用に関する定量化可能な側面を記録するためのデータ構造体です。kstat は、NULL で終わるリンクリストとして格納されます。各 kstat には共通のヘッダーセクションとタイプ固有のデータセクションとが含まれます。ヘッダーセクションは kstat_t 構造体によって定義されます。

http://developers.sun.com/solaris/articles/kstat_api.html の Sun Developer Network にある記事「Using kstat From Within a Program in the Solaris OS」では、kstat(3KSTAT) および libkstat(3LIB) API を使用して Solaris OS からメトリックスを抽出する方法についての実践的な例が 2 つ提供されています。これらの例は、「Walking Through All the kstat」と「Getting NIC kstat Output Using the Java Platform」です。

カーネル統計構造体のメンバー

kstat 構造体のメンバーは次のとおりです。

ks_class[KSTAT_STRLEN]

kstat のタイプを buscontrollerdevice_errordiskhatkmem_cachekstatmiscnetnfspages partitionrpsufsvmvmem のいずれかに分類します。

ks_crtime

kstat が作成された時刻。ks_crtime は一般に、各種カウンタのレートを計算するときに使用されます。

ks_data

kstat のデータセクションを指します。

ks_data_size

データセクションの合計サイズ (バイト)。

ks_instance

この kstat を作成したカーネルモジュールのインスタンス。ks_instanceks_moduleks_name と組み合わせることで、意味のある一意の名前が kstat に付けられます。

ks_kid

kstat の一意の ID。

ks_module[KSTAT_STRLEN]

この kstat を作成したカーネルモジュールを識別します。ks_moduleks_instanceks_name と組み合わせることで、意味のある一意の名前が kstat に付けられます。KSTAT_STRLENks_module の最大長を設定します。

ks_name[KSTAT_STRLEN]

ks_module および ks_instance とともに kstat に割り当てられた名前。KSTAT_STRLENks_module の最大長を設定します。

ks_ndata

複数レコードをサポートする kstat タイプ KSTAT_TYPE_RAWKSTAT_TYPE_NAMED、および KSTAT_TYPE_TIMER のデータレコード数を示します。

ks_next

チェーン内での次の kstat を指します。

ks_resv

予約済みのフィールド。

ks_snaptime

前回のデータスナップショットのタイムスタンプ。レートの計算時に役立ちます。

ks_type

データタイプ。バイナリデータの場合は KSTAT_TYPE_RAW、名前/値ペアの場合は KSTAT_TYPE_NAMED、割り込み統計の場合は KSTAT_TYPE_INTR、入出力統計の場合は KSTAT_TYPE_IO、イベントタイマーの場合は KSTAT_TYPE_TIMER になります。

カーネル統計構造体

さまざまな種類の kstat 用の構造体を次に示します。

kstat(9S)

デバイスドライバからエクスポートされる各カーネル統計 (kstat) は、ヘッダーセクションとデータセクションから構成されます。kstat(9S) 構造体は統計のヘッダー部分です。

kstat_intr(9S)

割り込み kstat 用の構造体。割り込みのタイプは次のとおりです。

  • ハード割り込み – ハードウェアデバイス自体がソースとなる

  • ソフト割り込み – システムが何らかのシステム割り込みソースを使用することで引き起こされる

  • ウォッチドッグ割り込み – 定期的なタイマー呼び出しによって引き起こされる

  • 見せかけの割り込み – 割り込みエントリポイントに入ったが、処理するべき割り込みが存在しなかった

  • 複数の処理 – ほかの任意のタイプから制御が戻る直前に、割り込みが検出されて処理された

ドライバは一般に、自身のハンドラから要求されたハード割り込みとソフト割り込みのみを報告しますが、見せかけのクラスの割り込みの測定は、自動ベクトル化デバイスが特定のシステム構成内で任意の割り込み待ち時間の問題を特定する際に役立ちます。同じタイプの割り込みを複数持つデバイスでは、複数の構造体を使用するべきです。

kstat_io(9S)

入出力 kstat 用の構造体。

kstat_named(9S)

名前付き kstat 用の構造体。名前付き kstat は名前-値ペアの配列です。これらのペアは kstat_named 構造体に保持されます。

カーネル統計関数

kstat を使用するための関数を次に示します。

kstat_create(9F)

kstat(9S) 構造体を割り当てて初期化します。

kstat_delete(9F)

システムから kstat を削除します。

kstat_install(9F)

完全に初期化された kstat をシステムに追加します。

kstat_named_init(9F)kstat_named_setstr(9F)

名前付き kstat を初期化します。kstat_named_setstr() は、名前付き kstat のポインタに文字列 str を関連付けます。

kstat_queue(9F)

多数の入出力サブシステムは、管理対象となる基本的なトランザクションキューを少なくとも 2 つ持ちます。1 つは、処理対象として受け付けられたものの、まだ処理が開始されていないトランザクション用のキューです。もう 1 つは、アクティブに処理されているものの、まだ完了していないトランザクション用のキューです。このため、待機時間実行時間 という 2 つの累計時間統計が保持されます。待機時間は処理の開始前です。実行時間は処理中です。次の kstat_queue() ファミリ関数は、ドライバの待機キューと実行キュー間の遷移に基づいてこれらの時間を管理します。

Solaris Ethernet ドライバのカーネル統計

次の表で説明する kstat インタフェースは、Ethernet 物理層の統計をドライバから取得するための効果的な方法です。ユーザーが Ethernet 物理層の問題の診断や修復をより適切に行えるように、Ethernet ドライバからこれらの統計をエクスポートするようにしてください。link_up 以外のすべての統計では、存在しない場合のデフォルト値は 0 になります。link_up 統計の値は 1 を想定します。

次の例では、すべての共有リンク設定を提供しています。この場合、mii を使用して統計をフィルタリングしています。

kstat ce:0:mii:link_*

表 22-2 Ethernet MII/GMII 物理層インタフェースのカーネル統計

kstat 変数
種類
説明
xcvr_addr
KSTAT_DATA_UINT32
現在使用中のトランシーバの MII アドレスを提供します。
  • (0) - (31) は、ある特定の Ethernet デバイスで使用中の物理層デバイスの MII アドレス用です。

  • (-1) は、外部的にアクセス可能な MII インタフェースが存在しないため、MII アドレスが未定義または無関係である場合に使用されます。

xcvr_id
KSTAT_DATA_UINT32
現在使用中のトランシーバの特定のベンダー ID またはデバイス ID を提供します。
xcvr_inuse
KSTAT_DATA_UINT32
現在使用中のトランシーバのタイプを示します。IEEE aPhytType は次のセットを列挙します。
  • (0) その他、未定義

  • (1) MII インタフェースが存在しないが、トランシーバが接続されていない

  • (2) 10Mbps Clause 7 10Mbps Manchester

  • (3) 100BASE-T4 Clause 23 100Mbps 8B/6T

  • (4) 100BASE-X Clause 24 100Mbps 4B/5B

  • (5) 100BASE-T2 Clause 32 100Mbps PAM5X5

  • (6) 1000BASE-X Clause 36 1000Mbps 8B/10B

  • (7) 1000BASE-T Clause 40 1000Mbps 4D-PAM5

このセットは、ifMauType で指定されるセットより小さくなります。ifMauType は、前出のすべてとその半二重/全二重オプションを含むように定義されています。この情報は cap_* 統計から提供可能であるため、xcvr_inusecap_* を組み合わせて不足する定義を派生させることで、ifMayType のすべての組み合わせを提供できます。

cap_1000fdx
KSTAT_DATA_CHAR
デバイスが 1Gbps 全二重をサポートすることを示します。
cap_1000hdx
KSTAT_DATA_CHAR
デバイスが 1Gbps 半二重をサポートすることを示します。
cap_100fdx
KSTAT_DATA_CHAR
デバイスが 100Mbps 全二重をサポートすることを示します。
cap_100hdx
KSTAT_DATA_CHAR
デバイスが 100Mbps 半二重をサポートすることを示します。
cap_10fdx
KSTAT_DATA_CHAR
デバイスが 10Mbps 全二重をサポートすることを示します。
cap_10hdx
KSTAT_DATA_CHAR
デバイスが 10Mbps 半二重をサポートすることを示します。
cap_asmpause
KSTAT_DATA_CHAR
デバイスが非対称ポーズ Ethernet フロー制御をサポートすることを示します。
cap_pause
KSTAT_DATA_CHAR
cap_pause が 1 に設定され、cap_asmpause が 0 に設定されている場合、デバイスが対称ポーズ Ethernet フロー制御をサポートすることを示します。cap_asmpause が 1 に設定されている場合、cap_pause の意味は次のようになります。
  • cap_pause = 0 受信輻輳に基づいてポーズを送信します。

  • cap_pause = 1 ポーズを受信し、輻輳を避けるために送信速度を落とします。

cap_rem_fault
KSTAT_DATA_CHAR
デバイスがリモート障害インジケーションをサポートすることを示します。
cap_autoneg
KSTAT_DATA_CHAR
デバイスが自動ネゴシエーションをサポートすることを示します。
adv_cap_1000fdx
KSTAT_DATA_CHAR
デバイスが 1Gbps 全二重のサポートを通知していることを示します。
adv_cap_1000hdx
KSTAT_DATA_CHAR
デバイスが 1Gbps 半二重のサポートを通知していることを示します。
adv_cap_100fdx
KSTAT_DATA_CHAR
デバイスが 100Mbps 全二重のサポートを通知していることを示します。
adv_cap_100hdx
KSTAT_DATA_CHAR
デバイスが 100Mbps 半二重のサポートを通知していることを示します。
adv_cap_10fdx
KSTAT_DATA_CHAR
デバイスが 10Mbps 全二重のサポートを通知していることを示します。
adv_cap_10hdx
KSTAT_DATA_CHAR
デバイスが 10Mbps 半二重のサポートを通知していることを示します。
adv_cap_asmpause
KSTAT_DATA_CHAR
デバイスが非対称ポーズ Ethernet フロー制御のサポートを通知していることを示します。
adv_cap_pause
KSTAT_DATA_CHAR
adv_cap_pause が 1 に設定され、adv_cap_asmpause が 0 に設定されている場合、デバイスが対称ポーズ Ethernet フロー制御のサポートを通知していることを示します。adv_cap_asmpause が 1 に設定されている場合、adv_cap_pause の意味は次のようになります。
  • adv_cap_pause = 0 受信輻輳に基づいてポーズを送信します。

  • adv_cap_pause = 1 ポーズを受信し、輻輳を避けるために送信速度を落とします。

adv_rem_fault
KSTAT_DATA_CHAR
リンク先に転送する予定の障害がデバイスで発生していることを示します。
adv_cap_autoneg
KSTAT_DATA_CHAR
デバイスが自動ネゴシエーションのサポートを通知していることを示します。
lp_cap_1000fdx
KSTAT_DATA_CHAR
リンク先のデバイスが 1Gbps 全二重をサポートすることを示します。
lp_cap_1000hdx
KSTAT_DATA_CHAR
リンク先のデバイスが 1Gbps 半二重をサポートすることを示します。
lp_cap_100fdx
KSTAT_DATA_CHAR
リンク先のデバイスが 100Mbps 全二重をサポートすることを示します。
lp_cap_100hdx
KSTAT_DATA_CHAR
リンク先のデバイスが 100Mbps 半二重をサポートすることを示します。
lp_cap_10fdx
KSTAT_DATA_CHAR
リンク先のデバイスが 10Mbps 全二重をサポートすることを示します。
lp_cap_10hdx
KSTAT_DATA_CHAR
リンク先のデバイスが 10Mbps 半二重をサポートすることを示します。
lp_cap_asmpause
KSTAT_DATA_CHAR
リンク先のデバイスが非対称ポーズ Ethernet フロー制御をサポートすることを示します。
lp_cap_pause
KSTAT_DATA_CHAR
lp_cap_pause が 1 に設定され、lp_cap_asmpause が 0 に設定されている場合、リンク先のデバイスが対称ポーズ Ethernet フロー制御をサポートすることを示します。lp_cap_asmpause が 1 に設定されている場合、lp_cap_pause の意味は次のようになります。
  • lp_cap_pause = 0 リンク先が受信輻輳に基づいてポーズを送信します。

  • lp_cap_pause = 1 リンク先がポーズを受信し、輻輳を避けるために送信速度を落とします。

lp_rem_fault
KSTAT_DATA_CHAR
リンクの障害がリンク先で発生していることを示します。
lp_cap_autoneg
KSTAT_DATA_CHAR
リンク先のデバイスが自動ネゴシエーションをサポートすることを示します。
link_asmpause
KSTAT_DATA_CHAR
リンクが非対称ポーズ Ethernet フロー制御で動作していることを示します。
link_pause
KSTAT_DATA_CHAR
ポーズ機能の解決を示します。link_pause が 1 に設定され、link_asmpause が 0 に設定されている場合、リンクが対称ポーズ Ethernet フロー制御で動作していることを示します。link_asmpause が 1 に設定されていて、それがリンクのローカルビューに対して相対的である場合、link_pause の意味は次のようになります。
  • link_pause = 0 このステーションが受信輻輳に基づいてポーズを送信します。

  • link_pause = 1 このステーションがポーズを受信し、輻輳を避けるために送信速度を落とします。

link_duplex
KSTAT_DATA_CHAR
リンクのデュプレックスを示します。
  • link_duplex = 0 リンクが停止しており、デュプレックスは不明です。

  • link_duplex = 1 リンクが動作しており、モードは半二重です。

  • link_duplex = 2 リンクが動作しており、モードは全二重です。

link_up
KSTAT_DATA_CHAR
リンクが動作しているか、それとも停止しているかを示します。
  • link_up = 0 リンクが停止しています。

  • link_up = 1 リンクが動作しています。

動的計測を行うための DTrace

DTrace は、ユーザープログラムとオペレーティングシステム自体の両方の動作を検査するための包括的な動的トレース機能です。DTrace を使用すると、プローブと呼ばれる環境内の戦略的な場所で、データを収集できます。DTrace では、スタックトレースやタイムスタンプ、関数の引数などのデータを記録できるほか、単純にプローブの起動回数を記録することもできます。DTrace ではプローブを動的に挿入できるため、コードをコンパイルし直す必要はありません。DTrace の詳細については、『Solaris 動的トレースガイド』および『DTrace ユーザーガイド』を参照してください。DTrace BigAdmin System Administration Portal には、DTrace に関する記事、XPerts セッション、およびその他の情報へのリンクが多数含まれています。