ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
64 ビットに対応したデバイスドライバに対する入出力制御のサポート
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
attach(9E) ルーチンは、次に示すような、すべてのデバイスに必要な一般的な初期化タスクを実行します。
インスタンスごとの状態構造体の割り当て
デバイス割り込みの登録
デバイスのレジスタのマッピング
mutex 変数と条件変数の初期化
電源管理可能なコンポーネントの作成
マイナーノードの作成
これらのタスクのコード例については、「attach() エントリポイント」を参照してください。
文字デバイスドライバは、タイプ S_IFCHR のマイナーノードを作成します。S_IFCHR のマイナーノードを指定すると、このノードを表す文字型特殊ファイルが最終的に /devices 階層に表示されます。
次の例は、文字ドライバの標準的な attach(9E) ルーチンを示しています。デバイスに関連付けられているプロパティーは一般に、attach() ルーチンで宣言されます。この例では、定義済みの Size プロパティーを使用しています。Size は、ブロックデバイスでのパーティションのサイズを取得するための Nblocks プロパティーに相当します。たとえば、ディスク装置で文字入出力を実行している場合は、Size を使用してパーティションのサイズを取得できます。Size は 64 ビットのプロパティーであるため、64 ビットのプロパティーインタフェースを使用する必要があります。この場合は、ddi_prop_update_int64(9F)を使用します。プロパティーの詳細については、「デバイスプロパティー」を参照してください。
例 15-1 文字ドライバの attach() ルーチン
static int xxattach(dev_info_t *dip, ddi_attach_cmd_t cmd) { int instance = ddi_get_instance(dip); switch (cmd) { case DDI_ATTACH: /* * Allocate a state structure and initialize it. * Map the device's registers. * Add the device driver's interrupt handler(s). * Initialize any mutexes and condition variables. * Create power manageable components. * * Create the device's minor node. Note that the node_type * argument is set to DDI_NT_TAPE. */ if (ddi_create_minor_node(dip, minor_name, S_IFCHR, instance, DDI_NT_TAPE, 0) == DDI_FAILURE) { /* Free resources allocated so far. */ /* Remove any previously allocated minor nodes. */ ddi_remove_minor_node(dip, NULL); return (DDI_FAILURE); } /* * Create driver properties like "Size." Use "Size" * instead of "size" to ensure the property works * for large bytecounts. */ xsp->Size = size_of_device_in_bytes; maj_number = ddi_driver_major(dip); if (ddi_prop_update_int64(makedevice(maj_number, instance), dip, "Size", xsp->Size) != DDI_PROP_SUCCESS) { cmn_err(CE_CONT, "%s: cannot create Size property\n", ddi_get_name(dip)); /* Free resources allocated so far. */ return (DDI_FAILURE); } /* ... */ return (DDI_SUCCESS); case DDI_RESUME: /* See the "Power Management" chapter in this book. */ default: return (DDI_FAILURE); } }