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.  ドライバの自動設定

ドライバのロードとアンロード

ドライバに必要なデータ構造体

modlinkage 構造体

modldrv 構造体

dev_ops 構造体

cb_ops 構造体

ロード可能なドライバインタフェース

_init() の例

_fini() の例

_info() の例

デバイス設定の概念

デバイスインスタンスとインスタンス番号

マイナーノードとマイナー番号

probe() エントリポイント

attach() エントリポイント

ドライバのソフト状態管理

ロック変数と条件変数の初期化

マイナーデバイスノードの作成

遅延接続

detach() エントリポイント

getinfo() エントリポイント

デバイス ID の使用

デバイス ID の登録

デバイスによって提供された ID の登録

組み立てられた ID の登録

デバイス ID の登録解除

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

8.  割り込みハンドラ

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

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

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

12.  電源管理

13.  Solaris ドライバの強化

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

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

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

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

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

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

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

20.  USB ドライバ

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

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

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

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

パート IV 付録

A.  ハードウェアの概要

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

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

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

索引

ドライバに必要なデータ構造体

自動設定をサポートするには、ドライバで次のデータ構造体を静的に初期化する必要があります。

ドライバは、図 5-1 のデータ構造体に依存しています。これらの構造体を正しく提供し、初期化する必要があります。これらのデータ構造体がない場合、ドライバが正しくロードされない可能性があります。その結果、必要なルーチンがロードされない可能性があります。ある操作がドライバによってサポートされていない場合は、nodev(9F) ルーチンのアドレスをプレースホルダとして使用できます。場合によっては、ドライバがエントリポイントをサポートするため、成功または失敗を返すだけで済むことがあります。その場合は、nulldev(9F) ルーチンのアドレスを使用できます。


注 - これらの構造体は、コンパイル時に初期化してください。ドライバは、それ以外のときにこれらの構造体へのアクセスや変更を行うべきではありません。


modlinkage 構造体

static struct modlinkage xxmodlinkage = {
    MODREV_1,       /* ml_rev */
    &xxmodldrv,     /* ml_linkage[] */
    NULL            /* NULL termination */
};

最初のフィールドは、サブシステムをロードするモジュールのバージョン番号です。このフィールドは MODREV_1 にします。2 番目のフィールドは、次に定義されているドライバの modldrv 構造体を指しています。この構造体の最後の要素は、常に NULL にします。

modldrv 構造体

static struct modldrv xxmodldrv = {
    &mod_driverops,           /* drv_modops */
    "generic driver v1.1",    /* drv_linkinfo */
    &xx_dev_ops               /* drv_dev_ops */
};

この構造体では、モジュールについてさらに詳細に記述します。最初のフィールドでは、モジュールのインストールに関連した情報を提供します。このフィールドは、ドライバモジュールの &mod_driverops に設定します。2 番目のフィールドは、modinfo(1M) で表示される文字列です。2 番目のフィールドには、ドライバのバイナリを生成したソースコードのバージョンを識別するために十分な情報を含めます。最後のフィールドは、次のセクションで定義されるドライバの dev_ops 構造体を指しています。

dev_ops 構造体

static struct dev_ops xx_dev_ops = {
    DEVO_REV,       /* devo_rev */
    0,              /* devo_refcnt  */
    xxgetinfo,      /* devo_getinfo: getinfo(9E) */
    nulldev,        /* devo_identify: identify(9E) */
    xxprobe,        /* devo_probe: probe(9E) */
    xxattach,       /* devo_attach: attach(9E) */
    xxdetach,       /* devo_detach: detach(9E) */
    nodev,          /* devo_reset */
    &xx_cb_ops,     /* devo_cb_ops */
    NULL,           /* devo_bus_ops */
    &xxpower        /* devo_power: power(9E) */
};

dev_ops(9S) 構造体は、カーネルがデバイスドライバの自動設定エントリポイントを見つけることができるようにします。devo_rev フィールドは、構造体のリビジョン番号を識別します。このフィールドは DEVO_REV に設定する必要があります。devo_refcnt フィールドは 0 に初期化する必要があります。次の場合を除き、関数のアドレスフィールドには該当するドライバエントリポイントのアドレスを入力します。

devo_cb_ops メンバーには、cb_ops(9S) 構造体のアドレスを含めます。devo_bus_ops フィールドは NULL に設定する必要があります。

cb_ops 構造体

static struct cb_ops xx_cb_ops = {
    xxopen,         /* open(9E) */
    xxclose,        /* close(9E) */
    xxstrategy,     /* strategy(9E) */
    xxprint,        /* print(9E) */
    xxdump,         /* dump(9E) */
    xxread,         /* read(9E) */
    xxwrite,        /* write(9E) */
    xxioctl,        /* ioctl(9E) */
    xxdevmap,       /* devmap(9E) */
    nodev,          /* mmap(9E) */
    xxsegmap,       /* segmap(9E) */
    xxchpoll,       /* chpoll(9E) */
    xxprop_op,      /* prop_op(9E) */
    NULL,           /* streamtab(9S) */
    D_MP | D_64BIT, /* cb_flag */
    CB_REV,         /* cb_rev */
    xxaread,        /* aread(9E) */
    xxawrite        /* awrite(9E) */
};

cb_ops(9S) 構造体には、デバイスドライバの文字操作とブロック操作のためのエントリポイントが含まれています。ドライバでサポートされていないエントリポイントはすべて、nodev(9F) に初期化します。たとえば、文字デバイスドライバは、ブロックのみのフィールド (cb_stategy など) をすべて nodev(9F)に設定します。mmap(9E) エントリポイントは、以前のリリースとの互換性のために保持されていることに注意してください。ドライバは、devmap(9E) エントリポイントをデバイスメモリーのマッピングのために使用します。devmap(9E) がサポートされている場合は、mmap(9E)nodev(9F) に設定します。

streamtab フィールドは、ドライバが STREAMS ベースかどうかを示します。STREAMS ベースであるのは、第 19 章ネットワークデバイスのドライバで説明されているネットワークデバイスドライバのみです。STREAMS ベースでないドライバではすべて、streamtab フィールドを NULL に設定する必要があります

cb_flag メンバーには、次のフラグが含まれています。

cb_revcb_ops 構造体のリビジョン番号です。このフィールドは CB_REV に設定する必要があります。