[ 前のページ ] [ 次のページ ] [ 目次 ] [ 索引 ] [ 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ビット・フレンドリ・インタフェースを持っています。

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.2 64ビット・アドレスをサポートするシステム・サービス

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.5 Cの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コマンド行修飾子で定義する方法と, 定義をソース・プログラムに直接指定する方法があります。次の例を参照してください。

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 ]