RMSサービス,$QIOシステム・サービス,およびOpenVMS Alphaシステムが提供するほとんどのデバイス・ドライバによる入出力操作は, P2またはS2空間と直接行われます。
本章では$QIOシステム・サービスが 64ビット・アドレスをサポートする方法について説明します。 また 64ビット・アドレスをサポートする/しない OpenVMS Alphaデバイス・ドライバ, 64ビット・アドレスをサポートする OpenVMS Alphaディスクおよびテープ・ドライバの一覧を示します。
ユーザが作成したデバイス・ドライバは, 64ビット・アドレスをサポートするよう修正することができます。詳細は 『OpenVMS Alpha Guide to Upgrading Privileged-Code Applications』 を参照してください。すべての関数内で 64ビット・バッファ・アドレスをサポートするよう修正したデバイス・ドライバの例については, SYS$EXAMPLESディレクトリのLRDRIVERデバイス・ドライバを参照してください。
- 重要
- OpenVMS Alphaバージョン7.0は, OpenMVS Alpha特権インタフェースおよびデータ構造が大幅に変更されています。 そのためV7.0より前のバージョンのOpenVMS Alphaで使用していたユーザ作成の特権コード・アプリケーション, およびデバイス・ドライバを OpenVMS Alpha V7.0以降で正しく実行するためには, 再コンパイルおよび再リンクしなければなりません。
必要な変更をV7.0で行った場合は, ユーザが作成した特権コード・アプリケーションを再コンパイルおよび再リンクする必要はありません。
再コンパイルおよび再リンクについての詳細は, 『OpenVMS Alpha Guide to Upgrading Privileged-Code Applications』または 『OpenVMS Version 7.2リリース・ノート[翻訳版]』を参照してください。
$QIOおよび$QIOWシステム・サービスは,次の引数を取ることができます。
$QIO[W] efn,chan,func,iosb,astadr,astprm,p1,p2,p3,p4,p5,p6これらのサービスは,(第3章 で説明されている) 64ビット・フレンドリ・インタフェースを持ち, 64ビット・アドレスをサポートすることができます。
64ビット・アドレスのサポートを目的として,$QIOおよび $QIOWシステム・サービス引数のデータ型に加えられた変更を 表 7-1に示します。
引数 | 以前の型 | 新しい型 | 説明 |
---|---|---|---|
efn | 符号なし ロングワード |
- | イベント・フラグ番号。変更なし。 |
chan | 符号なしワード | - | チャネル番号。変更なし。 |
func | 符号なし ロングワード |
- | I/O関数コード。変更なし。 |
iosb | 32ビット・ ポインタ[1] |
64ビット・ ポインタ |
クォドワードI/O状態ブロック(IOSB)へのポインタ。 IOSB形式は変更なし。 |
astadr | 32ビット・ ポインタ[1] |
64ビット・ ポインタ |
呼び出し者のASTルーチンのプロシージャ値。Alphaシステムでは, プロシージャ値はプロシージャ・ディスクリプタへのポインタである。 |
astprm | 符号なし ロングワード[2] |
クォドワード | ASTルーチンの引数値。 |
P1 | ロングワード[2] | クォドワード | デバイスに依存する引数。P1はしばしばバッファ・アドレスである。 |
P2 | ロングワード[2] | クォドワード | デバイスに依存する引数。下位32ビットだけが, P2をバッファ・サイズとして使用するシステム提供のFDTルーチンによって使用される。 |
P3 | ロングワード[2] | クォドワード | デバイスに依存する引数。 |
P4 | ロングワード[2] | クォドワード | デバイスに依存する引数。 |
P5 | ロングワード[2] | クォドワード | デバイスに依存する引数。 |
P6 | ロングワード[2] | クォドワード | デバイスに依存する引数。 場合によってP6は,診断バッファのアドレスを含むために使用される。 |
[1] 32ビット・ポインタは,『OpenVMS Calling Standard』 の要求に従い, 64ビットに符号拡張されていた。 [2] 32ビット・ロングワード値は,『OpenVMS Calling Standard』 の要求に従い, 64ビットに符号拡張されていた。 |
通常,$QIO P1引数はバッファ・アドレスを指定します。 読み込み関数および書き込み関数をサポートする,システム提供の上位レベル FDTルーチンはすべて,この規則を使用します。P1引数によって, $QIOサービスの呼び出し者が,64ビット・サポートを要求するかどうかが決定されます。 $QIOシステム・サービスが64ビットのI/O要求を拒否すると, 次に示す回復不可能なシステム・エラー状態が返ります。
SS$_NOT64DEVFUNC 64-bit address not supported by device for this functionこの回復不可能な状態値は,次の環境のもとで返されます。
デバイス・ドライバは,64ビット・アドレスのサポートを I/O関数コードごとに宣言します。 ディスク・デバイス・ドライバおよびテープ・デバイス・ドライバは,仮想,論理, および物理的な読み込み関数と書き込み関数において, ディスク・デバイスとテープ・デバイスを対象とするデータ転送で 64ビット・アドレスをサポートします。たとえば,OpenVMS SCSIディスク・クラス・ドライバのSYS$DKDRIVERは,IO$_READVBLK関数および IO$_WRITEVBLK関数において 64ビット・アドレスをサポートしますが, IO$_AUDIO関数ではサポートしません。
64ビット・アドレスをサポートするOpenVMS Alphaデバイス・ドライバには, 次のドライバが含まれます。
ドライバ | 説明 |
---|---|
SYS$DADDRIVER | ローカル・エリア・ディスク・クライアント・ディスク・ドライバ |
SYS$DKDRIVER | SCSIディスク・クラス・ドライバ |
SYS$DUDRIVER | DSAディスク・クラス・ドライバ |
SYS$DVDRIVER | Intel 83077AAのフロッピー・ディスク |
SYS$ECDRIVER | LAN driver for PMAI |
SYS$ERDRIVER | LAN driver for DE422 |
SYS$ESDRIVER | LAN driver for DESUA |
SYS$EWDRIVER | TULIP LAN, PCI |
SYS$EXDRIVER | DEMNA LAN, XMI |
SYS$EZDRIVER | SGEC/INEC/TGEC LAN |
SYS$FADRIVER | FDDI for Futurebus |
SYS$FCDRIVER | DEFZA, DEFTA LAN, TC |
SYS$FRDRIVER | DEFEA LAN, EISA |
SYS$FXDRIVER | DEMFA LAN, XMI |
SYS$GKDRIVER | SCSI汎用クラス・ドライバ |
SYS$HCDRIVER | OTTOクラスATM |
SYS$ICDRIVER | TMS380 LAN, TC |
SYS$IRDRIVER | TMS380 EISAトークン・リング |
SYS$LADDRIVER | Local Area Disk |
SYS$LASTDRIVER | Local Area System Transport |
SYS$LRDRIVER | VL82C106 parallel printer driver |
SYS$MADDRIVER | ローカル・エリア・クライアント・テープ |
MBDRIVER | メールボックス・ドライバ |
SYS$MKDRIVER | SCSIテープ・クラス・ドライバ |
NLDRIVER | ヌル・デバイス・ドライバ |
SYS$PADRIVER | SHAC CIおよびDSSIポート・ドライバ |
SYS$PEDRIVER | NI SCSポート・ドライバ |
SYS$PIDRIVER | NCR 53C710 DSSIポート |
SYS$PKCDRIVER | SCSI NCR 53C94ポート |
SYS$PKEDRIVER | NCR53C810 SCSIポート |
SYS$PKJDRIVER | ADAPTEC 1742A SCSIポート |
SYS$PKSDRIVER | SIMport TC-SCSIポート |
SYS$PKTDRIVER | NCR 53C710 SCSIポート |
SYS$PKZDRIVER | XZA SCSIポート |
SYS$PNDRIVER | NPORT SCSポート |
SYS$PUDRIVER | CI UDAポート・ドライバ |
SYS$SHDRIVER | ボリューム・シャドウィング |
SYS$TUDRIVER | MSCP/DSAテープ・クラス |
SYS$WPDRIVER | ウォッチポイント・ドライバ |
OpenVMS Alphaバージョン7.0で64ビット・アドレスをサポートしない OpenVMS Alphaデバイス・ドライバを 表 7-3に示します。
ドライバ | 説明 |
---|---|
SYS$CTDRIVER | CTERMドライバ |
SYS$FBDRIVER | ターミナル・フォールバック・ドライバ |
SYS$FTDRIVER | 擬似ターミナル・ドライバ |
SYS$FYDRIVER | DUP DSAプロトコル・クラス・ドライバ |
SYS$GQADRIVER | QVISIONドライバ |
SYS$GTADRIVER | DECwindows TX driver for Flamingo |
SYS$GXADRIVER | Flamingo CXTurbo (aka SFB, aka HX)ドライバ |
SYS$GYADRIVER | SFB+ aka HX+, aka FFBドライバ |
SYS$GYBDRIVER | PCIバス上のTGAグラフィクス用ドライバ |
SYS$IEDRIVER | DECwindows拡張 |
SYS$IKBDRIVER | DECwindows PCXALキーボード |
SYS$IKDRIVER | DECwindows LKxxxキーボード |
SYS$IMBDRIVER | DECwindows PCXAS (PS2)マウス |
SYS$IMDRIVER | DECwindows VSxxxマウス |
SYS$INDRIVER | DECwindows入力ドライバ |
SYS$LTDRIVER | LATターミナル・ドライバ |
NDDRIVER | DECnet Phase IV DLE (MOPサポート) |
NETDRIVER | DECnet Phase IV |
SYS$RTTDRIVER | リモートDECnetターミナル・ドライバ |
SYS$SODRIVER | AMD79C30A Audio/ISDNドライバ |
SYS$TTDRIVER | ターミナル・クラス・ドライバ |
DECW$XTDRIVER | Xターミナル・クラス・ドライバ |
SYS$YRDRIVER | Z85C30 SCCターミナル・ポート・ドライバ |
SYS$YSDRIVER | PC87312ターミナル・ポート・ドライバ |
32ビット・バッファ・アドレスに制限されるドライバについて, 特に次の点に注意してください。
64ビット・アドレスをサポートするOpenVMS Alpha I/O機能コードを 表 7-4に示します。
ドライバのタイプ | 機能コード | 64ビット・アドレス |
---|---|---|
ディスク | IO$_READLBLK | P1 |
IO$_READPBLK | P1 | |
IO$_READVBLK | P1 | |
IO$_WRITECHECK | P1 | |
IO$_WRITELBLK | P1 | |
IO$_WRITEPBLK | P1 | |
IO$_WRITEVBLK | P1 | |
磁気テープ | IO$_READLBLK | P1 |
IO$_READPBLK | P1 | |
IO$_READVBLK | P1 | |
IO$_WRITELBLK | P1 | |
IO$_WRITEOF | P1 | |
IO$_WRITEPBLK | P1 | |
IO$_WRITEVBLK | P1 | |
メールボックス | IO$_READLBLK | P1 |
IO$_READPBLK | P1 | |
IO$_READVBLK | P1 | |
IO$_WRITELBLK | P1 | |
IO$_WRITEPBLK | P1 | |
IO$_WRITEVBLK | P1 | |
Local AreaNetwork (LAN) |
IO$_READLBLK | P1,P5 |
IO$_READPBLK | P1,P5 | |
IO$_READVBLK | P1,P5 | |
IO$_WRITELBLK | P1,P4,P5 | |
IO$_WRITEPBLK | P1,P4,P5 | |
IO$_WRITEVBLK | P1,P4,P5 |
$QIO IO$_DIAGNOSE関数は強化され, SCSIクラス・ドライバのGKDRIVER,DKDRIVER,およびMKDRIVERに対して 64ビット・アドレッシングをサポートするようになりました。つまり S2DGBの中で指定される仮想アドレスは,ユーザ・アプリケーションの要求に応じて 64ビット仮想アドレスになります。
$QIO IO$_DIAGNOSE引数を次に示します。
引数 | 目的 |
---|---|
P1 | S2DGB基底アドレス |
P2 | S2DGBの長さ |
P3 | 予約。0を指定する。 |
P4 | 予約。0を指定する。 |
P5 | 予約。0を指定する。 |
P6 | 予約。0を指定する。 |
STARLETで定義されるSCSI Diagnose Buffer (S2DGB)は, 32ビット・アドレッシングと64ビット・アドレッシングの2つの形式を認めています。 32ビット形式は OpenVMS Alphaバージョン6.2でサポートされている形式と同じです。 32ビットS2DGB形式を図 7-1に, 64ビットS2DGB形式を 図 7-2に示します。
構造の正しい長さは,定数S2DGB$K_XCDB64_LENGTH (値: 60 - 10進)と同様に, 定数S2DGB$K_XCDB32_LENGTH (値: 60 - 10進)によって定義されます。
S2DGB内のフィールドを次に定義します。フィールドの名前が32ビットと 64ビットとでそれぞれ異なる場合は,まず最初に32ビット名を示し,次に 64ビット名を括弧で囲んで示します。アドレスを格納するフィールドを除いて, すべてのフィールドは符号なしのロングワードです。
S2DGB$L_OPCODE
このフィールドは,ユーザ・アプリケーションがS2DGBのほかのフィールドに
32ビット仮想アドレスを指定するか,または64ビット仮想アドレスを指定するかに応じて,
S2DGB$K_OP_XCDB32またはS2DGB$K_OP_XCDB64を含みます。
S2DGB$L_FLAGS
このフィールドは,次の表に示すビット・フィールドを含みます。
これらのビット定義はビット0で始まり,省略されるビットはありません。これは,
Alpha OpenVMS V6.1以前で使用可能な
IO$_DIAGNOSEインタフェースとの互換性のために必要です。
S2DGB$V_READ | 実行されている操作が読み込みの場合,このビットは1である。 操作が書き込みの場合は0である。 |
S2DGB$V_DISCPRIV | このビットには, この操作で送られるIDENTIFYメッセージの中で使用される DiscPrivビット値が含まれる。S2DGB$V_TAGGED_REQが1の場合, このビットは無視される。なお, ポートによってはこのビットが無視される場合があるので注意する。 |
S2DGB$V_SYNCHRONOUS | このビットは,その値を SISC-2ドライバの中でユーザが制御できないために無視される。 |
S2DGB$V_OBSOLETE1 | このビットは無視される。以前のリリースではこのビットは, コマンドの再送の無効化を表していたが,現在は, SISC-2ドライバの中でユーザが制御できないために無視される。 |
S2DGB$V_AUTOSENSE | このビットが1の場合,S2DGB$L_32SENSEADDRおよびS2DGB$L_32SENSELENは,
有効なセンス・バッファ・アドレスと長さを含む。CHECK CONDITIONまたは
COMMAND TERMINATED状態が返される場合,REQUEST SENSEデータは,
S2DGB$L_32SENSEADDRおよびS2DGB$L_32SENSELENで定義されるバッファに返される。
S2DGB$V_AUTOSENSEが0の場合,S2DGB$L_32SENSEADDRおよび S2DGB$L_32SENSELENで定義されるバッファは無視される。このような場合, クラス・ドライバはオートセンス・データをプールに保存し, これを次のIO$_DIAGNOSEに返す。ただしこれは,IO$_DIAGNOSEがREQUEST SENSE CDBを持つ場合に限られる。 S2DGB$L_FLAGS内のほかのすべてのビットは0です。 |
S2DGB$V_TAGGED_REQ | このビットが1の場合,
タグ付きコマンド・キュー登録を使用しているものとして操作が処理され,
S2DGB$V_TAGは使用するタグ値を定義しておく必要がある。このビットが0の場合,
タグ付きコマンド・キュー登録を使用せずに操作が処理される。
タグ付きコマンド・キュー登録をサポートしないポートは常に,このビットが
0として動作する。なお,ポートによっては,適切なタグ付き操作を使用して,
非タグ付き操作をシミュレーションするので注意する。 S2DGB$V_TAGGED_REQが1の場合,
この3ビットのフィールドは次のコード化された定数値を含まなければならない。
S2DGB$K_ORDEREDは,コマンドがORDEREDキュー・タグで送られることを指定する。 S2DGB$K_EXPRESSは,コマンドがHEAD OF QUEUEキュー・タグで送られることを指定する。 S2DGB$V_TAGGED_REQが0の場合,このフィールドは無視される。 タグ付きコマンド・キュー登録をサポートしないポートは,常に S2DGB$V_TAGフィールドを無視し,すべてのコマンドを非タグ付き操作として送信する。 IO$_DIAGNOSE関数からは,自動的条件付き忠実処理(automatic contingent allegiance processing)はアクセスできない。また,これは3ビット・フィールドだが, 現在は2ビットのみ使用されている。つまり,上の3つの定数は, ビット位置ではなく値を表す。 |
S2DGB$L_32CDBADDR (S2DGB$PQ_64CDBADDR)
このフィールドは,このIO$_DIAGNOSE操作によってターゲットに送られる,
SCSIコマンド・データ・ブロック(CDB)の 32ビット(または64ビット)
仮想アドレスを含みます。
なお,S2DGB$PQ_64CDBADDRはクォドワードへのポインタであるのに対して, S2DGB$L_32CDBADDRはロングワードへのポインタであることに注意してください。
S2DGB$L_32CDBLEN (S2DGB$L_64CDBLEN)
このフィールドは,このIO$_DIAGNOSE操作によってターゲットに送られる,
SCSIコマンド・データ・ブロック(CDB)内のバイト数を含みます。(有効値: 2〜248。
ただし,ポートによってはより小さな長さにCDBを制限している場合もあります。
推奨値: 2〜16。)
S2DGB$L_32DATADDR (S2DGB$PQ_64DATADDR)
このフィールドは,このSCSI操作で使用されるDATAINまたは DATAOUTバッファの
32ビット(または64ビット)仮想アドレスを含みます。ターゲットに送られる
CDBがDATAINまたは DATAOUTバッファを使用しない場合,
このフィールドの値は0です。
なお,S2DGB$PQ_64DATADDRはクォドワードへのポインタであるのに対して, S2DGB$L_32DATADDRはロングワードへのポインタであることに注意してください。
S2DGB$L_32DATLEN (S2DGB$L_64DATLEN)
このフィールドは,
この操作に関連するDATAINまたはDATAOUTバッファ内のバイト数を含みます。
ターゲットに送られるCDBが DATAINまたはDATAOUTバッファを使用しない場合,
このフィールドの値は0です。(有効値: 0〜UCB$L_MAXBCNT。推奨値: 0〜65,536。
ポートはすべて,少なくとも
65,536バイトのデータ転送をサポートすることが求められます。)
S2DGB$L_32PADCNT (S2DGB$L_64PADCNT)
このフィールドは,この操作で必要なパディングDATAINまたは
DATAOUTバイト数を含みます。(有効値: 0
〜このシステム上のディスク・ブロック内の最大バイト数から 1を引いた値。
現在の有効値: 0〜511。)
S2DGB$L_32PHSTMO (S2DGB$L_64PHSTMO)
このフィールドは,フェーズ遷移が発生するまで,
または期待される割り込みの実行要求までの,ポート・ドライバの待ち時間(秒数)
を含みます。S2DGB$V_TAGGED_REQが1の場合,またはこのフィールドが0または
1を含む場合,現在設定されているフェーズ遷移の時間切れの値は変更しません。
(有効値: 0〜300 {5分})
S2DGB$L_32DSCTMO (S2DGB$L_64DSCTMO)
このフィールドは,切断していたトランザクションが再び接続するまでの,
ポート・ドライバの待ち時間(秒数)を含みます。S2DGB$V_TAGGED_REQが1の場合,
またはこのフィールドが0または1を含む場合,
現在設定されている切断の時間切れの値は変更しません。
(有効値: 0〜65,535 {約18時間})
S2DGB$L_32SENSEADDR (S2DGB$PQ_64SENSEADDR)
S2DGB$V_AUTOSENSEが1の場合,このフィールドは,この
SCSI操作で使用されるセンス・バッファの32ビット(または64ビット)
仮想アドレスを含みます。
S2DGB$V_AUTOSENSEが0の場合,このフィールドは無視されます。
なお,S2DGB$PQ_64SENSEADDRはクォドワードへのポインタであるのに対して, S2DGB$L_32SENSEADDRはロングワードへのポインタであることに注意してください。
S2DGB$L_32SENSELEN (S2DGB$L_64SENSELEN)
S2DGB$V_AUTOSENSEが1の場合,このフィールドは,
この操作に関連するセンス・バッファ内のバイト数を含みます。
(有効値: 0〜255。注意:値0はクラス・ドライバに対して,
受信したセンス・データの廃棄を指定します。
推奨値: 18。ポートによってはセンス・バイト数を18に制限しています。)
S2DGB$V_AUTOSENSEが0の場合,このフィールドは無視されます。
64ビットのS2DGBの設定例を示します。
#include <s2dgbdef.h> /* Define S2DGB */ #include <far_pointers.h> /* Define VOID_PQ */ S2DGB diag_desc; /* Set up some default S2DGB descriptor values */ diag_desc.s2dgb$l_opcode = OP_XCDB64 /* Use 64-bits */ diag_desc.s2dgb$l_flags = (S2DGB$M_READ | /* Flags*/ S2DGB$M_TAGGED_REQ | S2DGB$M_AUTOSENSE); diag_desc.s2dgb$v_tag = S2DGB$K_SIMPLE; /* SIMPLE que tag */ diag_desc.s2dgb$pq_64cdbaddr = (VOID_PQ)(&cdb[0]);/* Command addr */ diag_desc.s2dgb$l_64cdblen = 6; /* Command length */ diag_desc.s2dgb$pq_64dataddr = (VOID_PQ)(&buf[0]);/* Data addr */ diag_desc.s2dgb$l_64datlen = 20; /* Data length */ diag_desc.s2dgb$l_64padcnt = 0; /* Pad length */ diag_desc.s2dgb$l_64phstmo = 20; /* Phase timeout */ diag_desc.s2dgb$l_64dsctmo = 10; /* Disc timeout */ diag_desc.s2dgb$pq_64senseaddr = (VOID_PQ)(&asn[0]);/* Autosense addr */ diag_desc.s2dgb$l_64senselen = 255; /* Sense length */ diag_desc.s2dgb$l_reserved_1 = 0; /* Reserved */ . . . status = sys$qiow(0, target_chan, IO$_DIAGNOSE, &iosb, 0, 0, &diag_desc, S2DGB$K_XCDB64_LENGTH, 0, 0, 0, 0);パラメータがすべて有効な場合,クラス・ドライバは必要なポート関数を起動して, CDBの送信とデータの転送に加えて,入力 S2DGBによって定義されるセンス・データの戻し,保存,または廃棄を行います。 終了時には,戻りIOSBの形式を 図 7-3に示します。
DKDRIVER,GKDRIVER,およびMKDRIVERクラス・ドライバは,次に説明する場合を除き, 任意の時点で,1つのIO$_DIAGNOSE操作に限って(開始の入出力ルーチンの中で) アクティブであることを許可します。しかしアプリケーションは, センス・データの存在を正しく検出し,要求されるREQUEST SENSEコマンドを送信するために, IO$_DIAGNOSE要求を単一スレッド化する必要があります。これは,VAX IO$_DIAGNOSEの動作に一致するものです。たとえば, 3つの読み込みが警告メッセージを伴わずに実行されると,最初の読み込みがCHECK CONDITIONを受け取り, 2番目の読み込みが到着するときにセンス・データがターゲットによって廃棄されます。
DKDRIVER,GKDRIVER,およびMKDRIVERドライバは,すべてのアクティブ操作の S2DGB$V_AUTOSENSEフラグが 1に等しいときに限って,複数のIO$_DIAGNOSE操作が (開始の入出力ルーチンの中で)アクティブであることを許可します。 S2DGB$V_AUTOSENSEが0に等しいIO$_DIAGNOSEが発生した時点で, クラス・ドライバは上で説明した制限を適用します。