本章では,64ビット・アドレッシングをサポートし,RMSを使用してP2または S2空間への入出力操作を実現するために, RMSインタフェースに加えられた変更について示します。 既存のRMSコードにわずかな変更を加えるだけで,この RMS強化機能をすべて使用することができます。
RMSの64ビット・アドレッシングのサポートについての詳細は, 『OpenVMS Record Management Services Reference Manual』を参照してください。
RMSユーザ・インタフェースは,多くの制御データ構造(FAB,RAB,NAM,XAB) で構成されています。これらは32ビット・ポインタで一緒にリンクされ, ファイル名文字列と項目リストに加えて入出力バッファを含む I/Oバッファおよびさまざまなユーザ・データ・バッファに対する埋め込みポインタを含みます。 64ビットのアドレス指定可能リージョンをサポートするRMSを使用すると, 次に示すユーザI/Oバッファで64ビット・アドレスを使用できます。
64ビット・アドレッシングを実現するため, RMSインタフェースに対して次の強化が行われました。
RMSユーザ・インタフェース構造であるRAB64は,RABを拡張したもので, 64ビット・バッファ・アドレスに対処することができます。RAB64データ構造は, 図 5-1に示すように, 32ビットのRAB構造と, これに続く64ビット拡張で構成されています。
フィールド | このフィールドの拡張 | 説明 |
---|---|---|
RAB64$Q_CTX | RAB64$L_CTX | ユーザ・コンテキスト。RMSはこのフィールドを使用しないが,ユーザが使用する。 CTXフィールドは,ポインタを格納しておくために使用されることがある。 非同期I/Oの場合,ユーザにASTパラメータに相当する機能を提供する。 |
RAB64$PQ_KBF | RAB64$L_KBF | ランダム・アクセスするためのキー値を含むキーバッファ・アドレス ($GETおよび$FIND)。 |
RAB64$PQ_RBF | RAB64$L_RBF | レコード・バッファ・アドレス($PUT,$UPDATE,および$WRITE)。 |
RAB64$PQ_RHB | RAB64$L_RHB | レコード・ヘッダ・バッファ・アドレス(VFCレコード形式の固定部分)。 |
RAB64$Q_RSZ | RAB64$W_RSZ | レコード・バッファ・サイズ。 |
RAB64$PQ_UBF | RAB64$L_UBF | ユーザ・バッファ・アドレス($GETおよび$READ)。 |
RAB64$Q_USZ | RAB64$W_USZ | ユーザ・バッファ・サイズ。 |
名前にPQタグを含むフィールドは,64ビット・アドレス,または 32ビット・アドレスの符合拡張による 64ビット・アドレスのいずれも持つことができます。 そのため64ビット・アドレスの使用に関わらず, すべてのアプリケーションでフィールドを使用することができます。
大部分のレコードI/Oサービス要求では, デバイスとユーザのデータ・バッファとの間にRMS内部バッファがあります。 RMSサービスの$PUTは唯一の例外です。 デバイスがユニット・レコード・デバイスでネットワーク越しにアクセスされない場合, RMSはユーザ・レコード・バッファ(RBF)のアドレスを $QIOシステム・サービスに渡します。 64ビット・アドレス空間をサポートしないレコード単位取り扱い装置を対象として, 64ビット・アドレス空間に割り当てられているレコード・バッファ(RBF) を不適切に$PUTに指定すると,SS$_NOT64DEVFUNCが返されます($QIOについての詳細は 第7章を参照してください)。 RMSはRAB64$L_STVの2番目の状態値としてSS$NOT64DEVFUNCでエラー状態 RMS$_SYSを返します。
RMSシステム・サービスは,RAB64構造とRAB構造をサポートします。
アプリケーションが64ビット RMSサポートを使用するには, 最小限のソース・コードの変更だけが必要です。
RMSでは,RABを使用できる場所で,RAB64を使用することを認めています。 たとえば,あるRMSレコードやブロックI/Oサービスに渡される先頭引数として, RABの代わりにRAB64を使用することができます。
RAB64は,既存のRABの拡張で上位互換性があります。 そのため大部分のソース・モジュールは,RAB64内のフィールドへの参照を, まるでRABへの参照であるかのように取り扱うことができます。一方, 64ビット・バッファ・アドレスの場合は,次の 2つの条件が満たされるときに限って使用されます。
このアドレス・フィールドが-1を含む場合 | このフ ィールド内の アドレスが使用される | このフィールド内のサイズが使用される |
---|---|---|
RAB64$L_UBF | RAB64$PQ_UBF[1] | RAB64$Q_USZ |
RAB64$L_RBF | RAB64$PQ_RBF[1] | RAB64$Q_RSZ |
RAB64$L_KBF | RAB64$PQ_KBF | RAB64$B_KSZ |
RAB64$L_RHB | RAB64$PQ_RHB | FAB$B_FSZ |
[1] このフィールドは,64ビット・アドレス, または64ビットに符号拡張された32ビット・アドレスのいずれかを含むことができる。 |
RMSは,RABを使用できる場所でのRAB64の使用を認めていますが, ソース言語によっては,ほかの制限が課せられる場合があります。詳細は, 使用しているソース言語のマニュアルを参照してください。
次の新しいMACRO-32マクロおよびBLISSマクロが実装され, ユーザRAB構造に対する64ビット拡張をサポートします。
これらのマクロを使用することによって,次の状態が発生する。
次のBLISSマクロは,STARLET.R64ライブラリでだけ使用できる。これは, マクロが使用するQUADキーワードが,BLISS-64でだけ使用できるためである。 このため,このマクロを参照するBLISSルーチンはすべて, BLISS-64コンパイラを使用してコンパイルされなければならない。
先頭の2つのマクロ($RAB64および$RAB64_INIT)を使用することによって, 次の状態が発生する。
3番目のマクロ($RAB64_DECL)は, RAB$C_BLN64の長さのバイトのブロック構造を割り当てる。