日本-日本語

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

OpenVMS マニュアル


≫ 

OpenVMS
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページサイズの拡大に対するアプリケーションの対応
第 6 章:共用データの整合性の維持
第 7 章:アプリケーションデータ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:OpenVMS I64コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム

HP OpenVMS
OpenVMS VAX から OpenVMS I64 への
アプリケーションの移行


目次 索引

第 5 章
ページ・サイズの拡大に対するアプリケーションの対応

この章では,アプリケーションで VAX のページ・サイズに依存している部分を識別する方法を説明し,これらの問題に対する対処方法を示します。

5.1 概要

ページ・サイズは,オペレーティング・システムが操作するメモリの基本単位であり,一般にアプリケーションのレベルでは意識する必要はありません。特に,高級プログラミング言語や中級プログラミング言語で作成されたアプリケーションの場合には,ページ・サイズを直接操作することはほとんどありません。しかし,アプリケーションでシステム・サービスやランタイム・ライブラリ・ルーチンを呼び出し,次のようなメモリ管理機能を実行する場合には,ページ・サイズに依存する部分がアプリケーションに含まれている可能性があります。

  • 仮想メモリの割り当て

  • セクションをプロセスの仮想アドレス空間にマッピングする操作

  • メモリをワーキング・セット内にロックする操作

  • 仮想アドレス空間のセグメントの保護

これらを実行するシステム・サービスやランタイム・ライブラリ・ルーチンは,メモリをページ単位で操作します。これらのルーチンに対する引数として指定する値では, 1 ページが 512 バイトであるものと仮定しています。これは VAX アーキテクチャで定義されているページ・サイズです。 OpenVMS I64 では,デフォルトのページ・サイズは 8K バイトであり,将来の OpenVMS のリリースで 16K バイト,32K バイト,または 64K バイトのページ・サイズをサポートします。この後の節では,ルーチンを調べる方法について詳しく説明します。

このようなページ・サイズの違いは,上位のルーチンを使用したメモリ割り当てには影響を与えません。たとえば,C の mallocルーチンや freeルーチンなど,仮想メモリ領域を操作するランタイム・ライブラリ・ルーチンや,言語固有のメモリ割り当てルーチンは,ページ・サイズの違いの影響を受けません。

5.1.1 互換性機能

システム・サービスやランタイム・ライブラリ・ルーチンは, I64 システムにおいてもできるかぎり VAX システムと同じインタフェースや戻り値を維持しています。たとえば I64 システムでは,引数としてページ・カウント値を受け付けるルーチンのこれらの引数を ページレットと呼ぶ 512 バイトの量として解釈することにより, CPU 固有のページ・サイズと区別します。各ルーチンはページレットの値を CPU 固有のページに変換します。ページ・カウント値を返すルーチンは, CPU 固有のページからページレットに変換することにより,アプリケーションで期待される戻り値が 512 バイト単位で表現されるようにします。

注意

I64 システムでは,ページ・フレーム・セクションを作成する際に, SEC$M_PFNMAP フラグ付きで $CRMPSC ルーチンを使用することはできません。システム・サービス SYS$CREATE_GPFN,SYS$CRMPSC_GPFN_64, SYS$CRMPSC_PFN_64 のいずれかを呼び出さなければなりません。また,SEC$M_ARGS64 フラグを使用して,64 ビットの start_pfn 引数を指定したことを示さなければなりません。なお,64 ビットのシステム・サービスは,符号拡張した 32 ビット・アドレスを使用して呼び出すことができます。



互換性があるにもかかわらず,I64 システムでの一部のルーチンの動作は VAX システムでの動作と異なっており,ソース・コードを変更しなければならない可能性があります。たとえば I64 システムでは,セクション・ファイルをマッピングするシステム・サービス ($CRMPSC と$MGBLSC) は,CPU 固有のページ境界にアラインされたアドレス値を引数として指定しなければなりません。 VAX システムでは,これらのルーチンは引数のアドレス値を VAX ページ境界になるように調整します。 I64 システムでは,これらのアドレスは CPU 固有のページ境界には調整されません。

表 5-1 は,ページ・サイズに依存する部分を含んでいる可能性のあるメモリ管理ルーチンと,それらのルーチンがサポートする引数を示しています。この表には,各引数の機能と,これらの引数が I64 システムでどのように解釈されるかが示されています。この表には,ルーチンが受け付けるすべての引数が示されているわけではありません。ルーチンとその引数リストについての詳細は,『OpenVMS System Services Reference Manual』を参照してください。

表 5-1 メモリ管理ルーチンでページ・サイズに依存する可能性のある部分
ルーチン 引数 I64 システムでの動作
ワーキング・セット・リミットの調整
($ADJWSL)
pagcnt は,現在のワーキング・セット・リミットに加算される (またはワーキング・セット・リミットから減算される) ページ数を指定する。 値をページレットとして解釈し, CPU 固有のサイズのページを表現するために切り上げるか,または切り捨てる。
  wsetlm は,現在のワーキング・セット・リミットの値を示す。 値をページレットとして解釈し, CPU 固有のサイズのページを表現するために切り上げるか,または切り捨てる。
プロセスの作成
($CREPRC)
quota は,デフォルトのワーキング・セット・サイズ,ページング・ファイル・クォータ,ワーキング・セット拡張クォータなど,ページ・カウントを指定する複数のクォータ記述子を受け付ける。 値をページレットとして解釈し, CPU 固有のサイズのページを表現するために切り上げるか,または切り捨てる。
仮想アドレスの作成
($CRETVA)
inadr は,割り当てられるメモリの先頭のアドレスと末尾のアドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1 ページが割り当てられる。 CPU 固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
  retadr は,呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを示す。 変更なし。
マップ・セクションの作成
($CRMPSC)
inadr は,再マップされる領域を定義する先頭アドレスと末尾アドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1 ページがマッピングされる。ただし,SEC$M_EXPREG フラグが設定されている場合には,割り当てが P0 空間であるか P1 空間であるかを判断し,その結果を元に先頭アドレスが解釈される。 アドレスは CPU 固有のページにアラインされていなければならない (SEC$M_EXPREG フラグが設定されていない場合)。切り上げや切り捨ては実行されない (マッピングについての詳細は, 第 5.3 節 を参照)。
  retadr は,呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを示す。 使用可能なアドレス範囲の先頭アドレスと末尾アドレスを返す。これはマッピングされた合計サイズと異なる可能性がある。 relpag 引数を指定した場合には,この引数も指定しなければならない。
  flags は,作成またはマッピングされるセクションの種類と属性を指定する。 フラグ・ビット SEC$M_NO_OVERMAP は,既存のアドレス空間をマッピングしてはならないことを示す。
  relpag は,セクション・ファイルのマッピングを開始するページ・オフセットを指定する。 セクション・ファイルへのインデックスとして解釈され,単位はページレットであると解釈される。
  pagcnt は,マッピングされるファイル内のページ数 (ブロック数) を指定する。 ページレットとして解釈される。切り上げや切り捨ては実行されない。
  pfc は,ページ・フォルトが発生したときにマッピングしなければならないページ数を指定する。 CPU 固有のサイズのページとして解釈される。この引数の値を指定する場合には,各物理ページに対して少なくとも16 ページレットがマッピングされることを考慮しなければならない。これは,I64 システムが 8K バイト,16K バイト,32K バイト, 64K バイトの物理ページ・サイズをサポートするからである。システムでは,物理ページより小さいサイズをマッピングすることはできない。
仮想アドレスの削除
($DELTVA)
inadr は,割り当てが解除されるメモリの先頭アドレスと末尾アドレスを指定する。 CPU 固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
  retadr は,削除されたメモリの実際の先頭アドレスと末尾アドレスを示す。 変更なし。
プログラム領域/制御領域の拡張
($EXPREG)
pagcnt は, 512 バイト単位で割り当てるメモリ・サイズを指定する。 ページレット単位として解釈される。
  retadr は,呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを示す。 変更なし。
ジョブ情報/プロセス情報の取得
($GETJPI)
itmlst は,プロセスに関して返される情報を指定する。 JPI$_WSEXTENT など,多くの項目はページレット単位の値として解釈される。詳細は『OpenVMS System Services Reference Manual』を参照。
キュー情報の取得
($GETQUI)
itmlst は, func 引数によって指定された機能を実行する際に使用する情報を指定する。 いくつかの項目はページレット単位の値として解釈される。詳細は『OpenVMS System Services Reference Manual』を参照。
システムワイド情報の取得
($GETSYI)
itmlst は, 1 つ以上のノードに関して返される情報を指定する 一部の項目はページレット単位の値として解釈される。 SYI$_PAGE_SIZE という追加項目は,ノードがサポートするページ・サイズを指定する。詳細は『OpenVMS System Services Reference Manual』を参照。
ユーザ認証情報の取得
($GETUAI)
itmlst は,ユーザのユーザ登録ファイルからどの情報が返されるかを指定する。 一部の項目はページレット単位の値を返す。詳細は『OpenVMS System Services Reference Manual』を参照。
ロック・ページ
($LCKPAG)
inadr は,ロックされるメモリの先頭アドレスと末尾アドレスを指定する。 CPU 固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
  retadr は,ロックされたメモリの実際の先頭アドレスと末尾アドレスを示す。 変更なし。
プロセス・ワーキング・セット中のロック・イメージ
($LOCK_IMAGE)
address は,ワーキング・セット中にロックする,イメージ中のバイトのアドレスを指定する。 VAX および I64 でのみ使用可能。
グローバル・セクションのマップ
($MGBLSC)
inadr は,再マップする領域を定義する先頭アドレスと末尾アドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1 ページがマッピングされる。ただし,SEC$M_EXPREG フラグがセットされている場合には,割り当てが P0 空間なのか P1 空間なのかを判断し,その結果に従って先頭アドレスが解釈される。 アドレスは CPU 固有のページにアラインしなければならない (SEC$M_EXPREG フラグが設定されていない場合)。アドレスの切り上げや切り捨ては実行されない (マッピングについての詳細は 第 5.3 節 を参照)。
  retadr は,呼び出しの影響を受けたメモリの実際の先頭アドレスと末尾アドレスを示す。 マッピングされたメモリの 使用可能な部分の先頭アドレスと末尾アドレスを返す。
  relpag は,セクション・ファイルのマッピングを開始するページ・オフセットを指定する。 セクション・ファイルに対するインデックスとして解釈され,単位はページレットであると解釈される。
ワーキング・セットのパージ
($PURGWS)
inadr は,パージされるメモリの先頭アドレスと末尾アドレスを指定する。 CPU 固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
プロテクションの設定
($SETPRT)
inadr は,保護対象のメモリの先頭アドレスと末尾アドレスを指定する。 CPU 固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
  retadr は,保護されたメモリの実際の先頭アドレスと末尾アドレスを示す。 変更なし。
ユーザ認証ファイルの設定
($SETUAI)
itmlst は,ユーザ登録ファイルのどの情報を設定するかを指定する。 いくつかの項目はページレット単位の値として解釈される。詳細は,『OpenVMS System Services Reference Manual』を参照。
ジョブ・コントローラへ送信
($SNDJBC)
itmlst は, func 引数によって指定された機能を実行する際に使われる情報を指定する。 いくつかの項目はページレット単位の値として解釈される。詳細は『OpenVMS System Services Reference Manual』を参照。
ページのアンロック
($ULKPAG)
inadr は,アンロックするメモリの先頭アドレスと末尾アドレスを指定する。 CPU 固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
  retadr は,アンロックされたメモリの実際の先頭アドレスと末尾アドレスを示す。 変更なし。
プロセス・ワーキングセットからのイメージのアンロック
($UNLOCK_IMAGE)
address は,ワーキング・セットからアンロックするイメージ内のバイトのアドレスを指定する。 VAX および I64 でのみ使用可能。
  retadr は,アンロックされたメモリの実際の先頭アドレスと末尾アドレスを示す。 変更なし。
セクションのアップデート
($UPDSEC)
inadr は,ディスクに書き込むセクションの先頭アドレスと末尾アドレスを指定する。 CPU 固有のページになるように要求は切り上げられるか,または切り捨てられる。ディスク上の記憶領域で表現される実際のアドレス範囲だけがディスクに書き込まれる。
  retadr は,ディスクに書き込まれたメモリの実際の先頭アドレスと末尾アドレスを示す。 CPU 固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。

表 5-2 に示したランタイム・ライブラリ・ルーチンは,メモリ・ページを割り当てるか,または解放します。互換性を維持するために,これらのルーチンでは,ユーザが指定したページ・カウント情報をページレットの値として解釈します。

表 5-2 ランタイム・ライブラリ・ルーチンでページ・サイズに依存する可能性のある部分
ルーチン 引数 I64 システムでの動作
LIB$GET_VM_PAGE number-of-pages は,割り当てる連続ページのページ数を指定する。 ページレット単位の値として解釈され,CPU 固有のページに切り上げられるか,または切り捨てられる。
LIB$FREE_VM_PAGE number-of-pages は,割り当てを解除する連続ページのページ数を指定する。 ページレット単位の値として解釈され,CPU 固有のページに切り上げられるか,または切り捨てられる。


目次 索引

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