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

# 3システム・サービスの64ビット・アドレッシングのサポート

新規に，OpenVMSシステム・サービスが追加されました。また， 64ビット・アドレス空間を管理することを目的として， 多くの既存のサービスに変更が加えられました。本章では， 64ビット・アドレッシング，および VLMをサポートするシステム・サービスについて説明します。具体的には， 64ビット・アドレスをサポートするために既存の 32ビット・サービスに加えられた変更について説明し，新しく追加された 64ビット・システム・サービスの一覧を示します。

アプリケーション・プログラム内で 64ビット・アドレッシングをサポートするシステム・サービスの例については， 付録 Cを参照してください。 本章に示されているOpenVMSシステム・サービスについての詳細は， 『OpenVMS System Services Reference Manual: A-GETMSG』および 『OpenVMS System Services Reference Manual: GETQUI-Z』を参照してください。

# 3.1システム・サービスに関する用語

本書では，次に示すシステム・サービス定義を使用します。

32ビット・システム・サービス

  32ビット・システム・サービスは，すべてのアドレス引数を 32ビット・アドレスとして受け取ることが定義されているシステム・サービスです。 値渡しの場合，32ビット仮想アドレスは実際には32ビット符号拡張アドレスの可能性があり， この場合は64ビットがサービスに渡されます。

64ビット・フレンドリ・インタフェース

  64ビット・フレンドリ・インタフェースは，すべての 64ビット・アドレスで呼び出すことができるインタフェースです。 インタフェースにまったく変更がなく， 64ビット・アドレスを処理するのに変更も必要としない場合，その 32ビット・システム・サービス・インタフェースは， 64ビット・システム・サービス・フレンドリです。 システム・サービスを実現する内部コードは，変更を必要とする場合があります。 ただし，システム・サービス・インタフェースは変更の必要はありません。

  バージョン7.0より前のバージョンのOpenVMS Alphaの OpenVMS Alphaシステム・サービスの大部分は， 次の理由から64ビット・フレンドリ・インタフェースを持っています。

  - 『OpenVMS Calling Standard』では，標準ルーチンへの引数が 64ビットになるように定義している。ルーチンの呼び出し側は 32ビット引数を符合拡張して64ビットにする。

  - 64ビットの文字列ディスクリプタは，実行時に 32ビットの文字列ディスクリプタと区別できる( 64ビットの文字列ディスクリプタについての詳細は 『OpenVMS Calling Standard』参照)。

  - ユーザ可視RMSデータ構造は， 32ビット形式でない構造が使用されているかどうかを RMSルーチンが識別できるなど，型情報を埋め込むことができる(RMS 64ビット・アドレッシング・サポートについての詳細は， 第5章を参照)。

  64ビット・フレンドリ・システム・サービスの例には$QIO，$SYNCH， $ENQ，$FAOなどがあります。

  $CRETVA，$DELTVA，および$CRMPSCなど，メモリ管理システム・サービスの大部分は， 64ビット・フレンドリでないインタフェースを伴うルーチンです。 INADR引数およびRETADR引数配列を変更して 64ビット・アドレスを保持することは簡単ではありません。

64ビット・システム・サービス

  64ビット・システム・サービスは，すべての引数を 64ビット・アドレスとして受け付けるよう定義されているシステム・サービスです。 また64ビット・システム・サービスは，すべての仮想アドレスの 64ビット全体を使用して，64ビットの仮想アドレスを渡します。

  64ビット・システム・サービスのうち， 64ビット・アドレスを参照渡しで受け取るサービスには，_64 という接尾辞がつきます。 32ビットと 64ビットの両方で使用できるシステム・サービスでは，これによって 64ビット機能のバージョンと，対応する32ビット機能のバージョンが区別されます。 一方，新規サービスの場合は，この接尾辞によって， 64ビット長アドレス・セルが読み込み/書き込みされることが明確に示されます。 埋め込み64ビット・アドレスを含む構造が渡されるとき，この構造が 64ビット構造として自己識別しない場合にも，この接尾辞が使用されます。 ルーチンが受け取るのは64ビット・ディスクリプタのため，ルーチン名に"_64" を含める必要はありません。なお，任意の値を参照渡しで渡すときには， 接尾辞が必要ないことに注意してください。接尾辞が必要なのは， 64ビット・アドレスを参照渡しで渡すときです。

# 3.264ビット・アドレスをサポートするシステム・サービス

64ビット・アドレスをサポートするOpenVMS Alphaシステム・サービスを 表 3-1に示します。

RMSシステム・サービスもいくつかの64ビット・アドレッシング機能を提供しますが， 完全な64ビット・システム・サービスではないため，次の表には示されていません。 詳細は，第5章を参照してください。

### 表 3-1　64 ビット・システム・サービス :(クリックで表示)

# 3.3符号拡張チェック

表 3-1に示されていないOpenVMSシステム・サービス， および64ビット・アドレスを受け取ることが明示的に指定されていないユーザ作成システム・サービスはすべて， 符号拡張チェックを受けます。 これらのサービスに渡される引数が正しく符号拡張されていないと， SS$_ARG_GTR_32_BITSというエラー状態が返ります。

# 3.4言語の64ビット・システム・サービスのサポート

システム・サービスのC関数プロトタイプは SYS$LIBRARY:SYS$STARLET_C.TLB (またはSTARLET)にあります。

システム・サービスに64ビットMACRO-32マクロはありません。MACRO-32呼び出し者は， AMACROビルトインEVAX_CALLG_64マクロ，または $CALL64マクロを使用しなければなりません。MACRO-32プログラミングでの 64ビット・アドレッシングのサポートについての詳細は， 第12章を参照してください。

# 3.5CのNEW STARLET定義

OpenVMS Alpha V7.0以降， SYS$LIBRARY:SYS$STARLET_C.TLB (または STARLET)は，新規および拡張データ構造体定義，およびシステム・サービスの C関数プロトタイプを提供します。新しい定義は，OpenVMS C言語のコーディング規則およびSYS$LIBRARY:SYS$LIB_C.TLBで使用されている定義 (typedefs)との一貫性が向上しています。

既存ユーザのSTARLET.Hとのソース・レベルでの互換性を保持するために，"古い形式の" 関数宣言および定義が，省略時の設定としてそのまま提供されています。 新しいシステム・サービス関数プロトタイプおよびタイプ定義を利用するには， これらを明示的に有効にしなければなりません。

これには，__NEW_STARLETシンボルをDEC Cコマンド行修飾子で定義する方法と， 定義をソース・プログラムに直接指定する方法があります。次の例を参照してください。

- _NEW_STARLETシンボルをDEC Cコマンド行修飾子で定義する。

           /DEFINE=(__NEW_STARLET=1)

  または

- SYS$STARLET_C.TLBヘッダ・ファイルをインクルードする前に， Cソース・プログラムの中で_NEW_STARLETシンボルを定義する。

      #define __NEW_STARLET 1

      #include  <starlet.h>
      #include  <vadef.h>

Librarianユーティリティを使用すると， STARLET.Hの中で現在有効なシステム・サービス関数プロトタイプを確認できます。 次の例を参照してください。

         $ LIBRARY/OUTPUT=STARLET.H SYS$LIBRARY:SYS$STARLET_C.TLB/EXTRACT=STARLET

次の例は，STARLET.Hに定義されている新しいシステム・サービス関数プロトタイプを示します。

         #pragma __required_pointer_size __long

          int sys$expreg_64(
                    struct _generic_64 *region_id_64,
                    unsigned __int64 length_64,
                    unsigned int acmode,
                    unsigned int flags,
                    void *(*(return_va_64)),
                    unsigned __int64 *return_length_64);

         #pragma __required_pointer_size __short

DEC Cポインタ・サイズ・プログマについての詳細は， 『DEC C User's Guide for OpenVMS Systems』を参照してください。

次のソース・コード例は，プログラムの中で参照されている sys$expreg_64関数プロトタイプを示します。

         #define __NEW_STARLET 1               /* Enable "New Starlet" features */

         #include <starlet.h>                  /* Declare prototypes for system service
         s */
         #include <gen64def.h>                 /* Define GENERIC_64 type */
         #include <vadef.h>                    /* Define VA$ constants */

         #include <ints.h>                     /* Define 64-bit integer types */
         #include <far_pointers.h>             /* Define 64-bit pointer types */

         {
             int status;                       /* Ubiquitous VMS status value */
             GENERIC_64 region = { VA$C_P2 };  /* Expand in "default" P2 region */
             VOID_PQ p2_va;                    /* Returned VA in P2 space */
             uint64 length;                    /* Allocated size in bytes */
             extern uint64 page_size;          /* Page size in bytes */

             status = sys$expreg_64( ®ion, request_size, 0, 0, &p2_va, &length );
             ...

         }

新しい関数プロトタイプで使用されるデータ構造体を 表 3-2に示します。

### 表 3-2 _NEW_STARLET プロトタイプが使用する構造体

プロトタイプが 使用する構造体 | 定義されている ヘッダ・ファイル | 構造体メンバ名 の共通接頭辞 | 説明
--- | --- | --- | ---
struct _cluevthndl | cluevtdef.h | cluevthndl$ | クラスタ・イベント・ハンドル
struct _fabdef | fabdef.h | fab$ | ファイル・アクセス・ブロック
struct _generic_64 | gen64def.h | gen64$ | 汎用クォドワード構造体
struct _ieee | ieeedef.h | ieee$ | IEEE浮動小数点制御構造体
struct _ile2 [1] | iledef.h | ile2$ | 項目リスト・エントリ2
struct _ile3 [1] | iledef.h | ile3$ | 項目リスト・エントリ3
struct _ilea_64 [1] | ilea_64$ | iledef.h | 64ビット項目リスト・ エントリA構造体
struct _ileb_64 [1] | ileb_64$ | iledef.h | 64ビット項目リスト・ エントリB構造体
struct _iosa | iosadef.h | iosa$ | 入出力状態領域
struct _iosb | iosbdef.h | iosb$ | 入出力状態ブロック
struct _lksb | lksbdef.h | lksb$ | ロック状態ブロック
struct _rabdef | rabdef.h | rab$ | RMSレコード・アクセス・ブロック
struct _secid | seciddef.h | secid$ | グローバル・セクション識別子
struct _va_range | va_rangedef.h | va_range$ | 32ビット仮想アドレス範囲
[1]　starlet.h内の関数プロトタイプで， この構造体型の使用を要求するものはない。この構造体型は便宜上提供されており， 適切な場所で使用できる。

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