ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
dump() エントリポイントと print() エントリポイント
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
ディスク装置は、ブロックデバイスドライバの重要なクラスを表します。
Oracle Solaris ディスクドライバは、Oracle Solaris ディスクドライバに固有の ioctl コマンドの最小限のセットをサポートする必要があります。これらの入出力制御は、dkio(7I) のマニュアルページで指定されています。ディスク入出力制御は、デバイスドライバとの間でディスク情報を転送します。Oracle Solaris ディスク装置は、format(1M) や newfs(1M) などのディスクユーティリティーコマンドでサポートされています。必須の Sun ディスク入出力制御は次のとおりです。
ディスク制御装置を記述した情報を返します。
ディスクのパーティションマップを返します。
ディスクのパーティションマップを設定します。
ディスクのジオメトリを返します。
ディスクのジオメトリを設定します。
ディスクのボリューム構成テーブルを返します。
ディスクのボリューム構成テーブルを設定します。
Oracle Solaris DDI/DKI は、ファイルシステムのパフォーマンスを向上させるために入出力転送を最適化する機能を提供します。このメカニズムでは、ファイルシステムのディスクアクセスが最適化されるように入出力要求のリストが管理されます。入出力要求のキューへの入力の説明については、「非同期データ転送 (ブロックドライバ)」を参照してください。
diskhd 構造体は、入出力要求のリンクリストを管理するために使用されます。
struct diskhd { long b_flags; /* not used, needed for consistency*/ struct buf *b_forw, *b_back; /* queue of unit queues */ struct buf *av_forw, *av_back; /* queue of bufs for this unit */ long b_bcount; /* active flag */ };
diskhd データ構造体には、ドライバが操作できる 2 つの buf ポインタがあります。av_forw ポインタは、最初のアクティブな入出力要求を指しています。2 番目のポインタである av_back は、リスト上の最後のアクティブな要求を指しています。
disksort(9F) には、この構造体へのポインタが、処理されている現在の buf 構造体へのポインタとともに引数として渡されます。disksort() ルーチンは、ディスクのシークを最適化するために buf 要求をソートします。このルーチンは次に、buf ポインタを diskhd リストに挿入します。disksort() プログラムは、buf 構造体の b_resid 内にある値をソートキーとして使用します。ドライバは、この値の設定を担当します。ほとんどの Sun ディスクドライバは、シリンダグループをソートキーとして使用します。このアプローチによって、ファイルシステムの先読みアクセスが最適化されます。
diskhd リストにデータが追加されたら、デバイスはそのデータを転送する必要があります。デバイスが要求の処理によってビジー状態でない場合、xxstart() ルーチンは最初の buf 構造体を diskhd リストから取得し、転送を開始します。
デバイスがビジー状態の場合、ドライバは xxstrategy() エントリポイントから復帰します。ハードウェアでのデータ転送が完了すると、割り込みが生成されます。次に、デバイスに対する処理を行うために、ドライバの割り込みルーチンが呼び出されます。割り込みに対する処理を行ったあと、ドライバは、diskhd リスト内の次の buf 構造体を処理するために start() ルーチンを呼び出すことができます。