構成メソッドの作成
この項目では、「デバイスの構成」方式の仕組みについて説明します。 また、プログラマーが独自の装置構成方式を作成する際のガイドラインも提案します。
構文
説明
「構成」メソッドは、デバイスを「定義済み」(システムでは使用不可) から「使用可能」(システムで使用可能) に移動します。 デバイスにドライバーがある場合、Configure メソッドはデバイス・ドライバーをカーネルにロードし、デバイス特性をドライバーに記述します。 中間デバイス (SCSI バス・アダプターなど) の場合、このメソッドは、どの接続子デバイスを構成するかを決定し、その論理名を標準出力に書き込みます。
Configure メソッドは、 開発 構成コマンドまたは Configuration Manager のいずれかによって呼び出されます。 構成マネージャーはフェーズ 2 システム・ブートで 2 回目に実行され、実行時に繰り返し呼び出すことができるため、デバイスの Configure メソッドを呼び出して、使用可能なデバイスを構成することができます。 これはエラー状態ではありません。 中間デバイスの場合、Configure メソッドは子デバイスが存在するかどうかを検査します。 デバイスが中間デバイスでない場合、メソッドは単に戻ります。
通常、Configure メソッドは、デバイスに関して必要なすべての情報を構成データベースから取得します。 システム・ブートのフェーズを指定するオプションは、特定の機能を特定のフェーズに制限するために使用されます。
デバイスに親デバイスがある場合は、最初に親を構成する必要があります。 親が「使用可能」状態でない場合、デバイスの「構成」メソッドは失敗します。
規則により、Configure メソッドの名前の最初の 3 文字は cfgです。 名前の残りの部分 (デヴ) は、オペレーティング・システムのファイル名の制限に従って、メソッドを使用するデバイスまたはデバイス・グループを識別する任意の文字にすることができます。
フラグ
| 項目 | 説明 |
|---|---|
| -l 名前 | 構成するデバイスの論理名を識別します。 |
| -1 | デバイスがシステム・ブート処理のフェーズ 1 で構成されていることを指定します。 このオプションは、-2フラグ。 もし、-1また、-2フラグが指定されている場合、実行時に Configure メソッドが呼び出されます。 |
| -2 | デバイスがシステム・ブートのフェーズ 2 で構成されていることを指定します。 このオプションは、-1フラグ。 もし、-1また、-2フラグが指定されている場合、実行時に Configure メソッドが呼び出されます。 |
デバイス重要プロダクト・データ (VPD) の処理
重要プロダクト・データ (VPD) を提供するデバイスは、各デバイスの PdDv オブジェクトで VPD フラグ記述子を TRUE に設定することによって、事前定義デバイス (PdDv) オブジェクト・クラスで識別されます。 Configure メソッドは、デバイスから VPD を取得し、それをカスタマイズされた VPD (CuVPD) オブジェクト・クラスに保管する必要があります。 該当するハードウェア資料を参照して、デバイスの VPD を取得する方法を判別してください。 多くの場合、VPD は sysconfig サブルーチンを使用してデバイス・ドライバーから取得されます。
VPD がデバイスから取得されると、Configure メソッドは CuVPD オブジェクト・クラスを照会して、デバイスにハードウェア VPD が保管されているかどうかを確認します。 その場合、メソッドは、デバイスから取得した VPD と CuVPD オブジェクト・クラスから取得した VPD を比較します。 どちらの場合も VPD が同じであれば、それ以上の処理は必要ありません。 異なる場合は、デバイスの CuVPD オブジェクト・クラスの VPD を更新します。 デバイスの CuVPD オブジェクト・クラスに VPD がない場合は、デバイスの VPD を追加します。
まず、デバイスの VPD を CuVPD オブジェクト・クラス内の VPD と比較することにより、 CuVPD オブジェクト・クラスへの変更が削減されます。 これは、通常、デバイスからの VPD が変更されないためです。 データベース書き込みの数を減らすと、パフォーマンスが向上し、データ損失の可能性が最小限に抑えられます。
Understanding Configure Method Errors
検出されたエラーの多くについて、Configure メソッドは適切な終了コードで終了します。 また、Configure メソッドが実行した操作の一部を元に戻す必要がある場合もあります。 例えば、デバイス・ドライバーをロードしてデバイスをドライバーに定義した後に、Configure メソッドでマイクロコードのダウンロード中にエラーが発生することがあります。 この場合、メソッドは sysconfig サブルーチンを使用してドライバーからデバイスを終了し、 ロード・テキスト サブルーチンを使用してドライバーをアンロードします。
特殊ファイルが正常に割り振られ、エラーが発生する前に特殊ファイルが作成された場合、Configure メソッドは特殊ファイルを削除せず、メジャー番号とマイナー番号の割り当てを解除しません。 これは、オペレーティング・システムの構成スキームでは、デバイスが構成解除されていても、デバイスのメジャー番号とマイナー番号、およびスペシャル・ファイルの両方を維持できるためです。
デバイスが再度構成されると、Configure メソッドは、メジャー番号とマイナー番号が割り振られていること、およびスペシャル・ファイルが存在することを認識します。
Configure メソッドが子デバイスをチェックするまでに、デバイスは正常に構成されています。 子デバイスの検査中に発生したエラーは、 E_FINDCHILD 終了コードで示されます。 開発 コマンドは、Configure メソッドが正常に完了したかどうかを検出します。 必要に応じて、子デバイスの検索中にエラーが発生したことを示すメッセージが表示されます。
構成方法を作成するためのガイドライン
以下のタスクは、Configure メソッドを作成するためのガイドラインです。 特定の装置に対する書き込み時に、一部のタスクが省略されることがあります。 例えば、デバイスが中間デバイスではないか、ドライバーがない場合、メソッドはそれに応じて作成されます。 装置には、これらのタスクにリストされていない特殊な要件がある場合もあります。
Configure メソッドは以下を行う必要があります。
- 入力パラメーターを検証します。 構成するデバイスを識別するために、 - 論理名フラグを指定する必要があります。 -1 フラグと -2 フラグを同時に指定することはできません。
- オブジェクト・データ・マネージャー (ODM) を初期化します。 odm_initialize サブルーチンを使用し、 オッズ・ロック サブルーチンを使用して構成データベースをロックします。 例については、Define メソッドの作成を参照してください。
- 構成するデバイスのカスタマイズ・デバイス (CuDv) オブジェクトを取得します。 CuDv オブジェクトのデバイス名記述子は、 -l 論理名フラグで指定された名前と一致しなければなりません。 指定された名前のオブジェクトが見つからない場合、メソッドはエラーで終了します。
- 構成するデバイスの事前定義デバイス (PdDv) オブジェクトを取得します。 PdDv オブジェクトの Unique Type ディスクリプターは、デバイスの CuDv オブジェクトの PdDv オブジェクト・クラス・ディスクリプターへのリンクと一致している必要があります。
- デバイスの PdDv オブジェクトの LED 値記述子を取得します。 デバイスの PdDv オブジェクトの LED 値記述子を取得し、 -1 または -2 フラグのいずれかが指定されている場合は、 setleds サブルーチンを使用してシステム LED にこの値を表示します。 これは、Configure メソッドがブート時にいつ実行されるかを指定します。 ブート時にシステムが構成中にハングした場合、表示される LED 値は、どの Configure メソッドが問題を引き起こしたかを示します。
デバイスが既に構成されていて (つまり、デバイスの CuDv オブジェクトの「デバイス状態」記述子が「使用可能」状態を示します)、中間デバイスである場合は、子デバイスの検出タスクにスキップします。 デバイスが構成されているが、中間デバイスではない場合、Configure メソッドはエラーなしで終了します。
デバイスが「定義済み」状態の場合、Configure Method は親デバイスを検査し、デバイスが存在するかどうかを検査し、デバイス VPD を取得して、デバイスの CuDv オブジェクトを更新する必要があります。
- デバイスに親がある場合、Configure メソッドは親の存在を検証し、親が Available 状態であることを検証します。 このメソッドは、デバイスの CuDv オブジェクトの親デバイス論理名記述子を参照して、親の名前を取得します。 装置に親がない場合、記述子はヌル・ストリングになります。
デバイスに親がある場合、Configure メソッドは親デバイスの CuDv オブジェクトを取得し、デバイス状態記述子を確認します。 オブジェクトが存在しないか、「使用可能」状態でない場合、メソッドはエラーで終了します。
親デバイスが存在する場合は、別の検査を行う必要があります。 構成方式では、同じ親に (同じ接続ロケーションで) 接続されている他のデバイスが構成されていないことを確認する必要があります。 例えば、スイッチ・ボックスを使用して、2 つのプリンターを同じポートに接続することができます。 各プリンターには同じ親と接続がありますが、一度に構成できるのは 1 つだけです。
Configure メソッドは、 CuDv オブジェクト・クラスをクエリーすることにより、このチェックを実行します。 これは、デバイス状態記述子が「使用可能」状態に設定されており、親デバイスの論理名と「親デバイスで接続されているロケーション」の記述子が、構成されているデバイスの記述子と一致するオブジェクトを照会します。 一致するものが見つかると、メソッドはエラーで終了します。
- デバイスの存在を確認します。 デバイスがアダプター・カードであり、実行時に Configure メソッドが呼び出された場合 ( -1 フラグと -2 フラグの両方がないことによって示されます)、Configure メソッドはアダプター・カードの存在を確認する必要があります。 これは、カードから POS レジスターを読み取ることによって行われます。 (POS レジスターは、 /dev/bus0 または /dev/bus1 スペシャル・ファイルを開いてアクセスすることによって取得されます。) カードが存在する場合、Configure メソッドは バス解決 ライブラリー・ルーチンを呼び出してバス・リソースを割り当て、システム内の他のアダプター・カードと競合しないようにする必要があるため、これは必須です。 カードが存在しない場合、または バス解決 ルーチンがバス・リソースの解決に失敗した場合、メソッドはエラーで終了します。
- デバイスにデバイス・ドライバーがあるかどうかを判別します。 Configure メソッドは、デバイスの PdDv オブジェクトのデバイス・ドライバー名記述子からデバイス・ドライバーの名前を取得します。 この記述子がヌル・ストリングの場合、デバイスにはデバイス・ドライバーがありません。
デバイスにデバイス・ドライバーがある場合、Configure メソッドは以下を行う必要があります。
- ロード・テキスト サブルーチンを使用して、デバイス・ドライバーをロードします。
- 性別 サブルーチンを使用して、デバイスのメジャー番号を判別します。
- getminor サブルーチンまたは Genminor サブルーチンを使用するか、独自のデバイス依存ルーチンを使用して、デバイスのマイナー番号を判別します。
- /dev ディレクトリーにスペシャル・ファイルを作成します (まだ存在しない場合)。 スペシャル・ファイルは、 Mknod サブルーチンによって作成されます。
- 装置依存構造 (DDS) を作成します。 この構造体には、デバイス・ドライバーに対してデバイスの特性を記述する情報が含まれています。 情報は通常、構成データベース内のデバイスの属性から取得されますが、必ずしも取得されるとは限りません。 該当するデバイス・ドライバー情報を参照して、デバイス・ドライバーが DDS の外観を予期しているかどうかを判別してください。 「装置依存構造 (DDS) の概要 (Device Dependent Structure (DDS) Overview)」 トピックでは、DDS 構造について説明します。
- sysconfig サブルーチンを使用して、DDS をデバイス・ドライバーに渡します。
- コードをデバイスにダウンロードする必要がある場合は、必要なファイルを読み、デバイス・ドライバーによって提供されるインターフェースを介してコードをデバイスに渡します。 ダウンロードするファイルは、事前定義属性 (PdAt) またはカスタマイズ属性 (CuAt) オブジェクトによって識別できます。 規則により、マイクロコード・ファイルは /etc/microcode ディレクトリー ( /usr/lib/microcode ディレクトリーへのシンボリック・リンク) にあります。 ダウンロードしたアダプター・ソフトウェアは、 /usr/lib/asw ディレクトリーにあります。
- デバイス VPD を取得します。 デバイス・ドライバーに関連するタスクが完了した後、またはデバイスにデバイス・ドライバーがなかった場合、Configure メソッドは、デバイスから重要プロダクト・データ (VPD) を取得する必要があるかどうかを判別します。 デバイスの PdDv オブジェクトの VPD フラグ記述子は、デバイスに VPD があるかどうかを指定します。
- CuDv オブジェクトを更新します。 この時点で、エラーが検出されなかった場合は、デバイスが構成されます。 Configure メソッドは、デバイスの CuDv オブジェクトの Device Status 記述子を更新して、そのデバイスが Available 状態にあることを示します。 また、現在 MISSING に設定されている場合は、変更状況記述子を SAME に設定します。 これは、デバイスがシステム・ブート時に検出されず、実行時に構成されている場合に発生する可能性があります。
- CuDv オブジェクト・クラスに現在表示されていない、検出された子デバイスを定義します。 これを行うには、新規の子デバイスごとに Define メソッドを呼び出します。 CuDv オブジェクト・クラスに既に定義されている、検出された子デバイスごとに、Configure メソッドは子デバイスの CuDv ステータス変更フラグ記述子を調べて、更新する必要があるかどうかを確認します。 記述子の値が ドント・ケアの場合は、何も行う必要はありません。 その他の値を持つ場合は、SAME に設定し、子デバイスの CuDv オブジェクトを更新する必要があります。 変更状況フラグ記述子は、システムが構成変更を示すために使用します。
デバイスが中間デバイスであるが、接続されている子デバイスを検出できない場合は、この情報について CuDv オブジェクト・クラスを照会します。 親デバイスがこれらの子デバイスを検出できないため、これらの子デバイスの「状況フラグの変更」記述子の値は ドント・ケア でなければなりません。 子デバイスには、子デバイスを構成するかどうかを Configure メソッドに指定する属性がある場合があります。 TTY デバイスの 自動構成 属性は、このタイプの属性の例です。
子デバイスが検出可能かどうかに関係なく、Configure メソッドは、構成する子デバイスのデバイス論理名をスペース文字で区切って標準出力に書き込みます。 メソッドが構成マネージャーによって呼び出された場合、マネージャーは、標準出力に書き込まれた子デバイス名ごとに Configure メソッドを呼び出します。
- すべてのオブジェクト・クラスをクローズし、 ODMを終了します。 すべてのオブジェクト・クラスを閉じて、 ODMを終了します。 エラーがない場合は、0 (ゼロ) コードを使用して終了します。
ファイル
| 項目 | 説明 |
|---|---|
| /dev/bus0 | POS レジスターが入っています。 |
| /dev/bus1 | POS レジスターが入っています。 |
| /etc/microcode ディレクトリー | マイクロコード・ファイルが入っています。 /usr/lib/microcode ディレクトリーへのシンボリック・リンク。 |
| /usr/lib/asw ディレクトリー | ダウンロードされたアダプター・ソフトウェアが含まれます。 |