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.  コンソールフレームバッファードライバ

索引

デバイス ID の使用

Solaris DDI インタフェースでは、ドライバが、デバイスの持続的な一意の識別子であるデバイス ID を提供できます。デバイス ID を使用すると、デバイスを識別または検索できます。デバイス ID は、/devices の名前やデバイス番号 (dev_t) とは独立しています。libdevid(3LIB) で定義された関数を使用すると、アプリケーションは、ドライバによって登録されたデバイス ID を読み取ったり操作したりすることができます。

ドライバがデバイス ID をエクスポートできるようにするには、ドライバは、そのデバイスが一意の ID を提供できるか、またはホストで生成された一意の ID を通常はアクセス不可能な領域に格納できることを確認する必要があります。WWN (World-Wide Number) は、デバイスによって提供される一意の ID の例です。デバイスの NVRAM や予約されたセクターは、ホストで生成された一意の ID を安全に格納できる、アクセス不可能な領域の例です。

デバイス ID の登録

ドライバは通常、そのドライバの attach(9E) ハンドラでデバイス ID を初期化して登録します。先に説明したように、ドライバは持続的なデバイス ID の登録を担当します。そのため、ドライバでは、一意の ID (WWN) を直接提供できるデバイスと、作成された ID が安定した記憶領域に書き込まれたり、その記憶領域から読み取られたりするデバイスの両方の処理が必要になることがあります。

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

デバイスがドライバに一意の識別子を提供できる場合、ドライバは単純に、この識別子を使用してデバイス ID を初期化し、その ID を Solaris DDI に登録できます。

/*
 * The device provides a guaranteed unique identifier,
 * in this case a SCSI3-WWN.  The WWN for the device has been
 * stored in the device's soft state.
 */
if (ddi_devid_init(dip, DEVID_SCSI3_WWN, un->un_wwn_len, un->un_wwn,
    &un->un_devid) != DDI_SUCCESS)
    return (DDI_FAILURE);

(void) ddi_devid_register(dip, un->un_devid);

組み立てられた ID の登録

ドライバはまた、一意の ID を直接提供しないデバイスのデバイス ID を登録する可能性もあります。これらの ID を登録するには、そのデバイスが少量のデータを予約領域に格納したり、取得したりできることが必要です。それにより、ドライバは組み立てられたデバイス ID を作成し、それを予約領域に書き込むことができます。

/*
 * the device doesn't supply a unique ID, attempt to read
 * a fabricated ID from the device's reserved data.
 */

if (xxx_read_deviceid(un, &devid_buf) == XXX_OK) {
    if (ddi_devid_valid(devid_buf) == DDI_SUCCESS) {
        devid_sz = ddi_devi_sizeof(devid_buf);
        un->un_devid = kmem_alloc(devid_sz, KM_SLEEP);
        bcopy(devid_buf, un->un_devid, devid_sz);
        ddi_devid_register(dip, un->un_devid);
        return (XXX_OK);
    }
}

/*
 * we failed to read a valid device ID from the device
 * fabricate an ID, store it on the device, and register
 * it with the DDI
 */

if (ddi_devid_init(dip, DEVID_FAB, 0, NULL, &un->un_devid)
    == DDI_FAILURE) {
    return (XXX_FAILURE);
}

if (xxx_write_deviceid(un) != XXX_OK) {
    ddi_devid_free(un->un_devid);
    un->un_devid = NULL;
    return (XXX_FAILURE);
}

ddi_devid_register(dip, un->un_devid);
return (XXX_OK);

デバイス ID の登録解除

ドライバは通常、detach(9E) 処理の一部として、割り当てられたすべてのデバイス ID の登録を解除して解放します。ドライバはまず、ddi_devid_unregister(9F) を呼び出して、デバイスインスタンスのデバイス ID の登録を解除します。ドライバは次に、ddi_devid_free(9F) を呼び出し、ddi_devid_init(9F) によって返されたハンドルを渡すことによって、デバイス ID のハンドル自体を解放する必要があります。ドライバは、WWN またはシリアル番号データに割り当てられたすべての領域の管理を担当します。