[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]

# 564ビット・アドレッシングを対象とする RMSインタフェースの強化

本章では，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ビット・アドレスを使用できます。

- UBF (ユーザ・レコード・バッファ)

- RBF (レコード・バッファ)

- RHB (固定長レコード・ヘッダ・バッファ; VFCレコード形式の固定部分)

- KBF (ランダム・アクセス用のキー値を含むキー・バッファ)

ただし，RAB$L_PBFで示されるプロンプト・バッファは例外です。これは， ターミナル・ドライバが64ビット・アドレスを使用しないためです。

64ビット・アドレッシングを実現するため， RMSインタフェースに対して次の強化が行われました。

- 次のユーザI/Oサービスのために， データ・バッファがP2またはS2空間に存在する。

  - レコードI/Oサービス: $GET, $FIND, $PUT, $UPDATE

  - ブロックI/Oサービス: $READ, $WRITE

- RAB構造が， これらのサービスで使用するレコードおよびデータ・バッファを指す。

- 既存のRAB構造を拡張して， 64ビット・バッファ・ポインタとサイズ用に使用する。

- RMSブロックI/Oサービス($READおよび$WRITE)のバッファ・サイズの最大値を， 64K バイトから2G バイトに増やす。ただし次の場合は例外。

  - RMSジャーナリングの場合，ジャーナルされた$WRITEサービスは現在の最大値 (65535からジャーナル・オーバヘッドの99バイトを引いた値)に制限される。 最大値を超えると，RSZエラーが返される(RAB$L_STS)。

  - 磁気テープは，デバイス・ドライバ・レベルで引き続き 65535バイトに制限される。
  RMSレコードI/Oサービス($GET，$PUT，$UPDATE) のバッファ・サイズの最大値に変更はない。以前の RMSオン・ディスク・レコード・サイズの制限がそのまま適用される。

残りのRMSインタフェースは現時点では32ビットに制限される。

- FAB，RAB，NAM，およびXABは 32ビット空間に引き続き割り当てなければならない。

- ファイル名へのディスクリプタ，または埋め込みポインタ， 項目リストなどは，引き続き32ビット・ポインタでなければならない。

- RMSシステム・サービスへ渡される引数は，32ビット引数のままである。 64ビット引数を渡そうとすると，エラーSS$_ARG_GTR_32_BITSが返される。

# 5.1RAB64データ構造

RMSユーザ・インタフェース構造であるRAB64は，RABを拡張したもので， 64ビット・バッファ・アドレスに対処することができます。RAB64データ構造は， 図 5-1に示すように， 32ビットのRAB構造と， これに続く64ビット拡張で構成されています。

### 図 5-1　RAB64データ構造 :(クリックで表示)

RAB64に含まれるフィールドはRABフィールドとすべて同一ですが，フィールド名には， RAB接頭辞ではなくRAB64接頭辞が含まれます。RAB64はまた， 拡張部に次の新フィールドを含みます。

フィールド | このフィールドの拡張 | 説明
--- | --- | ---
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構造をサポートします。

# 5.264ビットRAB拡張の使用

アプリケーションが64ビット RMSサポートを使用するには， 最小限のソース・コードの変更だけが必要です。

RMSでは，RABを使用できる場所で，RAB64を使用することを認めています。 たとえば，あるRMSレコードやブロックI/Oサービスに渡される先頭引数として， RABの代わりにRAB64を使用することができます。

RAB64は，既存のRABの拡張で上位互換性があります。 そのため大部分のソース・モジュールは，RAB64内のフィールドへの参照を， まるでRABへの参照であるかのように取り扱うことができます。一方， 64ビット・バッファ・アドレスの場合は，次の 2つの条件が満たされるときに限って使用されます。

- RAB64$B_BLNフィールドがRAB64$C_BLN64に初期化され， 拡張が存在することを示している。

- RABの32ビット部分内の32ビット・アドレス・フィールドが -1 を含んでいる。

クォドワード・サイズ・フィールド内の値は， 32ビット・アドレス・フィールドの内容がその使用を指定しているときに限って使用されます。 この例を次に示します。

このアドレス・フィールドが-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の使用を認めていますが， ソース言語によっては，ほかの制限が課せられる場合があります。詳細は， 使用しているソース言語のマニュアルを参照してください。

# 5.3ユーザ RAB 構造をサポートするマクロ

次の新しいMACRO-32マクロおよびBLISSマクロが実装され， ユーザRAB構造に対する64ビット拡張をサポートします。

- MACRO-32マクロ

  - $RAB64 ($RABのカウンタパート)

  - $RAB64_STORE ($RAB_STOREのカウンタパート)

  これらのマクロを使用することによって，次の状態が発生する。

  - RAB$B_BLNにRAB$C_BLN64の定数が代入される。

  - 元のロングワードI/Oバッファが -1 に初期化され， USZおよびRSZワード・サイズが0に初期化される。

  - UBF，USZ，RBF，RSZ，RHB，またはKBFキーワードを使用して指定した値が， これらのキーワードのクォドワード・フィールドに移動する (これに対して，$RABおよび$RAB_STOREマクロは，これらの値を， これらのキーワードのロングワード[またはワード]フィールドに移動する)。

- BLISSマクロ

  次のBLISSマクロは，STARLET.R64ライブラリでだけ使用できる。これは， マクロが使用するQUADキーワードが，BLISS-64でだけ使用できるためである。 このため，このマクロを参照するBLISSルーチンはすべて， BLISS-64コンパイラを使用してコンパイルされなければならない。

  - $RAB64 ($RABのカウンタパート)

  - $RAB64_INIT ($RAB_INITのカウンタパート)

  - $RAB64_DECL ($RAB_DECLのカウンタパート)

  先頭の2つのマクロ($RAB64および$RAB64_INIT)を使用することによって， 次の状態が発生する。

  - RAB$B_BLNにRAB$C_BLN64の定数が代入される。

  - 元のロングワードI/Oバッファが -1 に初期化され， USZおよびRSZワード・サイズが0に初期化される。

  - キーワードUBF，USZ，RBF，RSZ，RHB，KBFに代入された値は， これらのキーワードのクォドワード・フィールドに移動される(これに対して， $RABおよび$RAB_INITマクロは，これらの値を， これらのキーワードのロングワード[またはワード]フィールドに移動する)。

  3番目のマクロ($RAB64_DECL)は， RAB$C_BLN64の長さのバイトのブロック構造を割り当てる。

[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ DOC Home ]