日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:仮想アドレス空間の概要
第 3 章:システム・サービスの 64 ビット・アドレッシングのサポート
第 4 章:メモリ管理 VLM 機能
第 5 章:64 ビット・アドレッシングを対象とする RMS インタフェースの強化
第 6 章:ファイル・システムの 64 ビット・アドレッシングのサポート
第 7 章:OpenVMS Alpha デバイスの 64 ビット・アドレッシングのサポート
第 8 章:OpenVMS Alpha 64 ビット API ガイドライン
第 9 章:64 ビット・アドレッシングをサポートする OpenVMS Alpha ツールおよびユーティリティ
第 10 章:言語およびポインタの 64 ビット・アドレッシング・サポート
第 11 章:DEC C RTL の 64 ビット・アドレッシング・サポート
付録 A :64 ビット・アドレッシングのための C マクロ
付録 B :64 ビット・アドレッシングのための MACRO-32 マクロ
付録 C :64 ビット・プログラム例
付録 D :VLM プログラム例
索引
PDF
OpenVMS ホーム
Open VMS Alpha オペレーティング・システム | HPE 日本

Open VMS Alpha オペレーティング・システム
64 ビット・アドレッシングおよび VLM 機能説明書


目次 索引





アドレス,サイズ,および長さの引数だけが,クォドワードとして値で渡されなければならない

値で渡される引数は,VAX 上ではロングワードに制限されています。 VAX API との互換性を実現するには,クォドワード引数を値渡しではなく参照渡しする必要があります。しかし,アドレス,サイズ,および長さは,アーキテクチャが原因で,理論的には OpenVMS VAX 上でロングワード,かつ OpenVMS Alpha 上ではクォドワードになる引数の例です。

API が OpenVMS VAX 上で利用できない場合であっても,すべての API 上での一貫性を実現するため,このガイドラインに従ってください。

ページ・サイズに依存する単位の使用を避ける

長さやオフセットなどの引数は,バイトなど,ページ・サイズに依存しない単位で指定します。

ページレットは不便な単位です。これは VAX との互換性を目的として開発され,OpenVMS Alpha 上で, OpenVMS VAX 互換インタフェースの中で使用されています。ページレットはそのサイズが VAX ページに等しく,ページ・サイズに依存しない単位とは考えられません。これは Alpha 上の CPU 固有ページとしばしば混乱されるためです。

例: EXPREG_64 内の Length_64 引数は,クォドワード・バイト・カウントとして,値で渡されます。

参照渡しされるすべてのデータをすべて自然にアラインする

呼び出されるルーチンは,コンパイラに対して引数がアラインされていることを指定し,これによってコンパイラは,より効率的なロードおよび保存のシーケンスを実行できます。データがそのままアラインされていない場合,性能は低下します。

参照渡しのデータが自然にアラインされていないために呼び出されたルーチンが正しく実行できない場合,ルーチンは明示的にチェックを実行し,アラインされていない場合はエラーを返す必要があります。たとえば,ロック付きロード,条件付き保存がルーチンの内部でデータについて実行される場合,データがアラインされていないと,ロック付きロード,条件付き保存は正しく処理されません。

8.3 32 ビット API から 64 ビット API への拡張

API の拡張を, 32 ビット設計の改善や新規機能の追加とは区別して考えると,必要な作業を容易に行うことができます。新しい 64 ビット API の中でのルーチンの呼び出しは,簡単なプログラミング作業に過ぎません。

64 ビット・ルーチンは,64 ビット形式の構造に加えて 32 ビット形式の構造を受け取る

API への呼び出しを簡単に修正できるように,インタフェースは, 64 ビット形式に加えて, 32 ビット形式の構造も受け取ることができなければなりません。

例: 32 ビット API が情報をディスクリプタで渡していた場合,新規インタフェースは同じ情報をディスクリプタで渡さなければなりません。

64 ビット・ルーチンは 32 ビット・ルーチンと同じ機能を提供する

新しい 64 ビット API が古い API の機能スーパセットではない場合でも,現在 32 ビット API を呼び出しているアプリケーションは,古い 32 ビット API への古い呼び出しの一部を保持することなく,完全にアップグレードして 64 ビット API を呼び出すことができなければなりません。

例: SYS$EXPREG_64 は P0,P1,および P2 プロセス空間で動作します。 SYS$EXPREG_64 は $EXPREG の機能スーパセットであるため,呼び出し側はすべての呼び出しを SYS$EXPREG に置換できます。

接尾辞 "_64" を適切に使用する

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

この規則は,ほかのルーチンに対しても同じように推奨されます。

例:

SYS$EXPREG_64 (region_id_64, length_64, acmode, return_va_64, return_length_64)
SYS$CMKRNL_64 (routine_64, quad_arglst_64)


64 ビット・アドレッシングのサポートを目的として拡張された 32 ビット・ルーチン・インタフェースの例を次に示します。この例では,ガイドラインで記述された各種の問題を処理しています。

古いシステム・サービス SYS$CRETVA の C 関数宣言は,次の形式で行われます。


#pragma required_pointer_size save 
#pragma required_pointer_size 32 
int sys$cretva ( 
        struct _va_range * inadr, 
        struct _va_range * retadr, 
        unsigned int       acmode); 
#pragma required_pointer_size restore 

新しいシステム・サービス SYS$CREATE_VA の C 関数宣言は,次の形式で行われます。


#pragma required_pointer_size save 
#pragma required_pointer_size 64 
int sys$cretva_64 ( 
        struct _generic_64 * region_id_64, 
        void *               start_va_64, 
        unsigned __int64     length_64, 
        unsigned int         acmode, 
        void **              return_va_64, 
        unsigned __int64 *   return_length_64); 
#pragma required_pointer_size restore 

SYS$CRETVA_64 の新規ルーチン・インタフェースは, _va_range構造の中で埋め込みポインタを訂正し, 64 ビットの region_id_64引数を参照で渡し, 64 ビットの length_64引数を値で渡します。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項