ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
Oracle Solaris DDI インタフェースでは、ドライバが、デバイスの永続的な一意の識別子であるデバイス ID を提供できます。デバイス ID を使用すると、デバイスを識別または検索できます。デバイス ID は、/devices の名前やデバイス番号 (dev_t) とは独立しています。libdevid(3LIB) で定義された関数を使用すると、アプリケーションは、ドライバによって登録されたデバイス ID を読み取ったり操作したりすることができます。
ドライバがデバイス ID をエクスポートできるようにするには、ドライバは、そのデバイスが一意の ID を提供できるか、またはホストで生成された一意の ID を通常はアクセス不可能な領域に格納できることを確認する必要があります。WWN (World-Wide Number) は、デバイスによって提供される一意の ID の例です。デバイスの NVRAM や予約されたセクターは、ホストで生成された一意の ID を安全に格納できる、アクセス不可能な領域の例です。
ドライバは通常、そのドライバの attach(9E) ハンドラでデバイス ID を初期化して登録します。先に説明したように、ドライバは持続的なデバイス ID の登録を担当します。そのため、ドライバでは、一意の ID (WWN) を直接提供できるデバイスと、作成された ID が安定した記憶領域に書き込まれたり、その記憶領域から読み取られたりするデバイスの両方の処理が必要になることがあります。
デバイスがドライバに一意の識別子を提供できる場合、ドライバは単にこの識別子を使用してデバイス ID を初期化し、その ID を Oracle 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 を作成し、それを予約領域に書き込むことができます。
/* * 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);
ドライバは通常、detach(9E) 処理の一部として、割り当てられたすべてのデバイス ID の登録を解除して解放します。ドライバはまず、ddi_devid_unregister(9F) を呼び出して、デバイスインスタンスのデバイス ID の登録を解除します。ドライバは次に、ddi_devid_free(9F) を呼び出し、ddi_devid_init(9F) によって返されたハンドルを渡すことによって、デバイス ID のハンドル自体を解放する必要があります。ドライバは、WWN またはシリアル番号データに割り当てられたすべての領域の管理を担当します。