新規に,OpenVMSシステム・サービスが追加されました。また, 64ビット・アドレス空間を管理することを目的として, 多くの既存のサービスに変更が加えられました。本章では, 64ビット・アドレッシング,および VLMをサポートするシステム・サービスについて説明します。具体的には, 64ビット・アドレスをサポートするために既存の 32ビット・サービスに加えられた変更について説明し,新しく追加された 64ビット・システム・サービスの一覧を示します。
アプリケーション・プログラム内で 64ビット・アドレッシングをサポートするシステム・サービスの例については, 付録 Cを参照してください。 本章に示されているOpenVMSシステム・サービスについての詳細は, 『OpenVMS System Services Reference Manual: A-GETMSG』および 『OpenVMS System Services Reference Manual: GETQUI-Z』を参照してください。
本書では,次に示すシステム・サービス定義を使用します。
バージョン7.0より前のバージョンのOpenVMS Alphaの OpenVMS Alphaシステム・サービスの大部分は, 次の理由から64ビット・フレンドリ・インタフェースを持っています。
64ビット・フレンドリ・システム・サービスの例には$QIO,$SYNCH, $ENQ,$FAOなどがあります。
$CRETVA,$DELTVA,および$CRMPSCなど,メモリ管理システム・サービスの大部分は, 64ビット・フレンドリでないインタフェースを伴うルーチンです。 INADR引数およびRETADR引数配列を変更して 64ビット・アドレスを保持することは簡単ではありません。
64ビット・システム・サービスのうち, 64ビット・アドレスを参照渡しで受け取るサービスには,_64 という接尾辞がつきます。 32ビットと 64ビットの両方で使用できるシステム・サービスでは,これによって 64ビット機能のバージョンと,対応する32ビット機能のバージョンが区別されます。 一方,新規サービスの場合は,この接尾辞によって, 64ビット長アドレス・セルが読み込み/書き込みされることが明確に示されます。 埋め込み64ビット・アドレスを含む構造が渡されるとき,この構造が 64ビット構造として自己識別しない場合にも,この接尾辞が使用されます。 ルーチンが受け取るのは64ビット・ディスクリプタのため,ルーチン名に"_64" を含める必要はありません。なお,任意の値を参照渡しで渡すときには, 接尾辞が必要ないことに注意してください。接尾辞が必要なのは, 64ビット・アドレスを参照渡しで渡すときです。
64ビット・アドレスをサポートするOpenVMS Alphaシステム・サービスを 表 3-1に示します。
RMSシステム・サービスもいくつかの64ビット・アドレッシング機能を提供しますが, 完全な64ビット・システム・サービスではないため,次の表には示されていません。 詳細は,第5章を参照してください。
表 3-1に示されていないOpenVMSシステム・サービス, および64ビット・アドレスを受け取ることが明示的に指定されていないユーザ作成システム・サービスはすべて, 符号拡張チェックを受けます。 これらのサービスに渡される引数が正しく符号拡張されていないと, SS$_ARG_GTR_32_BITSというエラー状態が返ります。
システム・サービスのC関数プロトタイプは SYS$LIBRARY:SYS$STARLET_C.TLB (またはSTARLET)にあります。
システム・サービスに64ビットMACRO-32マクロはありません。MACRO-32呼び出し者は, AMACROビルトインEVAX_CALLG_64マクロ,または $CALL64マクロを使用しなければなりません。MACRO-32プログラミングでの 64ビット・アドレッシングのサポートについての詳細は, 第12章を参照してください。
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コマンド行修飾子で定義する方法と, 定義をソース・プログラムに直接指定する方法があります。次の例を参照してください。
/DEFINE=(__NEW_STARLET=1)または
#define __NEW_STARLET 1 #include <starlet.h> #include <vadef.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 __shortDEC 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に示します。
プロトタイプが 使用する構造体 |
定義されている ヘッダ・ファイル |
構造体メンバ名 の共通接頭辞 |
説明 |
---|---|---|---|
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内の関数プロトタイプで, この構造体型の使用を要求するものはない。この構造体型は便宜上提供されており, 適切な場所で使用できる。 |