Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

階層化ドライバのハンドル – ターゲットデバイス

カーネルデバイスコンシューマは階層化ドライバのハンドル (ldi_handle_t) を使用して、LDI インタフェースを通してターゲットデバイスにアクセスする必要があります。ldi_handle_t 型は LDI インタフェースでのみ有効です。LDI は、デバイスが正常に開かれたときにこのハンドルを割り当てて返します。次にカーネルデバイスコンシューマはこのハンドルを使用することで、LDI インタフェースを通してターゲットデバイスにアクセスできます。LDI はデバイスを閉じるときにハンドルの割り当てを解除します。例については、LDI カーネルインタフェースの例を参照してください。

このセクションでは、カーネルデバイスコンシューマからターゲットデバイスにアクセスし、さまざまな種類の情報を取得する方法について説明します。カーネルデバイスコンシューマでターゲットデバイスを開いたり閉じたりする方法については、ターゲットデバイスを開く操作と閉じる操作を参照してください。カーネルデバイスコンシューマから、ターゲットデバイスで ターゲットデバイスへのアクセスwritestrategyioctl などの操作を実行する方法については、Accessing Target Devicesを参照してください。ターゲットデバイス情報の取得では、デバイス公開型やデバイスマイナー名などのターゲットデバイスの情報を取得するインタフェースについて説明します。ターゲットデバイスのプロパティー値の取得では、ターゲットデバイスのプロパティーの値とアドレスを取得するインタフェースについて説明します。カーネルデバイスコンシューマでターゲットデバイスからイベント通知を受信する方法については、非同期デバイスイベントの通知の受信を参照してください。

ターゲットデバイスを開く操作と閉じる操作

このセクションでは、ターゲットデバイスを開き、閉じるための LDI カーネルインタフェースについて説明します。open インタフェースは、階層化ドライバのハンドルへのポインタを取得します。open インタフェースは、デバイス番号、デバイス ID、またはパス名によって指定されたターゲットデバイスを開こうとします。開く操作が成功すると、open インタフェースはターゲットデバイスにアクセスするために使用できる階層化ドライバのハンドルを割り当てて返します。close インタフェースは、指定された階層化ドライバのハンドルと関連付けられているターゲットデバイスを閉じ、階層化ドライバのハンドルを解放します。

ldi_handle_t

ターゲットデバイスアクセス用の階層化ドライバのハンドルです。デバイスが正常に開かれたときに返される不透明なデータ構造体です。

ldi_open_by_dev(9F)

dev_t デバイス番号パラメータによって指定されたデバイスを開きます。

ldi_open_by_devid(9F)

ddi_devid_t デバイス ID パラメータによって指定されたデバイスを開きます。開くマイナーノード名も指定する必要があります。

ldi_open_by_name(9F)

パス名によってデバイスを開きます。パス名は、カーネルアドレス空間内の NULL で終わっている文字列です。パス名はスラッシュ (/) で始まる絶対パスにする必要があります。

ldi_close(9F)

ldi_open_by_dev(9F)、ldi_open_by_devid(9F)、または ldi_open_by_name(9F) によって開かれたデバイスを閉じます。ldi_close(9F) が返ったあと、閉じられたデバイスの階層化ドライバのハンドルは有効ではなくなります。

ターゲットデバイスへのアクセス

このセクションでは、ターゲットデバイスにアクセスするための LDI カーネルインタフェースについて説明します。これらのインタフェースによって、カーネルデバイスコンシューマは、階層化ドライバのハンドルによって指定されたターゲットデバイスで操作を実行できます。カーネルデバイスコンシューマは、ターゲットデバイスに対して readwritestrategyioctl などの操作を実行できます。

ldi_handle_t

ターゲットデバイスアクセス用の階層化ドライバのハンドルです。不透明なデータ構造体です。

ldi_read(9F)

ターゲットデバイスのデバイスエントリポイントに read 要求を渡します。この操作はブロックデバイス、文字デバイス、および STREAMS デバイスでサポートされます。

ldi_aread(9F)

ターゲットデバイスのデバイスエントリポイントに非同期の read 要求を渡します。この操作はブロックデバイスと文字デバイスでサポートされます。

ldi_write(9F)

ターゲットデバイスのデバイスエントリポイントに write 要求を渡します。この操作はブロックデバイス、文字デバイス、および STREAMS デバイスでサポートされます。

ldi_awrite(9F)

ターゲットデバイスのデバイスエントリポイントに非同期の write 要求を渡します。この操作はブロックデバイスと文字デバイスでサポートされます。

ldi_strategy(9F)

ターゲットデバイスのデバイスエントリポイントに strategy 要求を渡します。この操作はブロックデバイスと文字デバイスでサポートされます。

ldi_dump(9F)

ターゲットデバイスのデバイスエントリポイントに dump 要求を渡します。この操作はブロックデバイスと文字デバイスでサポートされます。

ldi_poll(9F)

ターゲットデバイスのデバイスエントリポイントに poll 要求を渡します。この操作はブロックデバイス、文字デバイス、および STREAMS デバイスでサポートされます。

ldi_ioctl(9F)

ターゲットデバイスのデバイスエントリポイントに ioctl 要求を渡します。この操作はブロックデバイス、文字デバイス、および STREAMS デバイスでサポートされます。LDI は STREAMS リンクと STREAMS ioctl コマンドをサポートしています。ldi_ioctl(9F) のマニュアルページの「STREAM IOCTLS」セクションを参照してください。streamio(7I) のマニュアルページの ioctl コマンドも参照してください。

ldi_devmap(9F)

ターゲットデバイスのデバイスエントリポイントに devmap 要求を渡します。この操作はブロックデバイスと文字デバイスでサポートされます。

ldi_getmsg(9F)

ストリームからメッセージブロックを取得します。

ldi_putmsg(9F)

メッセージブロックをストリーム上に配置します。

ターゲットデバイス情報の取得

このセクションでは、指定したターゲットデバイスに関するデバイス情報を取得するためにカーネルデバイスコンシューマが使用できる LDI インタフェースについて説明します。ターゲットデバイスは、階層化ドライバのハンドルによって指定します。カーネルデバイスコンシューマは、デバイス番号、デバイス公開型、デバイス ID、デバイスマイナー名、デバイスサイズなどの情報を受け取ることができます。

ldi_get_dev(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスの dev_t デバイス番号を取得します。

ldi_get_otyp(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスを開くために使用された open フラグを取得します。このフラグは、ターゲットデバイスが文字デバイスであるかブロックデバイスであるかを通知します。

ldi_get_devid(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスの ddi_devid_t デバイス ID を取得します。デバイス ID の使用を終えて ddi_devid_t を解放するには、ddi_devid_free(9F) を使用します。

ldi_get_minor_name(9F)

ターゲットデバイスのために開かれたマイナーノードの名前を格納しているバッファーを取得します。マイナーノード名の使用を終えてバッファーを解放するには、kmem_free(9F) を使用します。

ldi_get_size(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスのパーティションサイズを取得します。

ターゲットデバイスのプロパティー値の取得

このセクションでは、指定したターゲットデバイスに関するプロパティー情報を取得するためにカーネルデバイスコンシューマが使用できる LDI インタフェースについて説明します。ターゲットデバイスは、階層化ドライバのハンドルによって指定します。カーネルデバイスコンシューマはプロパティーの値とアドレスを受け取って、プロパティーが存在するかどうかを判定できます。

ldi_prop_exists(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスのプロパティーが存在する場合は 1 を返します。指定されたターゲットデバイスのプロパティーが存在しない場合は 0 を返します。

ldi_prop_get_int(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスに関連付けられている int 整数プロパティーを検索します。整数プロパティーが見つかった場合はプロパティー値を返します。

ldi_prop_get_int64(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスに関連付けられている int64_t 整数プロパティーを検索します。整数プロパティーが見つかった場合はプロパティー値を返します。

ldi_prop_lookup_int_array(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスの int 整数配列プロパティー値のアドレスを取得します。

ldi_prop_lookup_int64_array(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスの int64_t 整数配列プロパティー値のアドレスを取得します。

ldi_prop_lookup_string(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスの NULL で終わっている文字列プロパティー値のアドレスを取得します。

ldi_prop_lookup_string_array(9F)

文字列の配列のアドレスを取得します。文字列の配列は、階層化ドライバのハンドルによって指定されたターゲットデバイスの NULL で終わっている文字列プロパティー値へのポインタの配列です。

ldi_prop_lookup_byte_array(9F)

バイトの配列のアドレスを取得します。バイトの配列は、階層化ドライバのハンドルによって指定されたターゲットデバイスのプロパティー値です。

非同期デバイスイベントの通知の受信

カーネルデバイスコンシューマは LDI によって、イベント通知を登録し、ターゲットデバイスからイベント通知を受信できます。カーネルデバイスコンシューマは、イベントが発生したときに呼び出されるイベントハンドラを登録できます。カーネルデバイスコンシューマで LDI イベント通知インタフェースを使用してイベント通知を登録するには、カーネルデバイスコンシューマでデバイスを開き、階層化ドライバのハンドルを受信する必要があります。

LDI イベント通知インタフェースによって、カーネルデバイスコンシューマはイベント名を指定し、関連付けられているカーネルイベントの cookie を取得できます。カーネルデバイスコンシューマは次に、階層化ドライバのハンドル (ldi_handle_t)、cookie (ddi_eventcookie_t)、および ldi_add_event_handler(9F) へのイベントハンドラを渡して、イベント通知を登録できます。登録が正常に完了すると、カーネルデバイスコンシューマは一意の LDI イベントハンドラ識別子 (ldi_callback_id_t) を受信します。LDI イベントハンドラ識別子は、LDI イベント通知インタフェースでのみ使用できる不透明な型です。

LDI はほかのデバイスによって生成されたイベントを登録するための枠組みを提供します。LDI 自体は、イベントの種類を定義したり、イベントを生成するためのインタフェースを提供したりすることはありません。

次に、LDI 非同期イベント通知インタフェースについて説明します。

ldi_callback_id_t

イベントハンドラ識別子。不透明な型です。

ldi_get_eventcookie(9F)

階層化ドライバのハンドルによって指定されたターゲットデバイスのイベントサービス cookie を取得します。

ldi_add_event_handler(9F)

ldi_callback_id_t 登録識別子によって指定されたコールバックハンドラを追加します。コールバックハンドラは、ddi_eventcookie_t cookie によって指定されたイベントが発生したときに呼び出されます。

ldi_remove_event_handler(9F)

ldi_callback_id_t 登録識別子によって指定されたコールバックハンドラを削除します。