日本-日本語
≫  お問い合わせ

製品とサービス >  ソフトウェアとOS >  OpenVMS >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V8.3
ライブラリ

タイトルページ
目次
まえがき
第 1 章:移行プロセスの概要
第 2 章:移行方法の選択
第 3 章:アプリケーションの移行
第 4 章:再コンパイルと再リンクの概要
第 5 章:ページ・サイズの拡大に対するアプリケーションの対応
第 6 章:共有データの整合性の維持
第 7 章:アプリケーション・データ宣言の移植性の確認
第 8 章:アプリケーション内の条件処理コードの確認
第 9 章:アプリケーションのトランスレート
第 10 章: ネイティブなイメージとトランスレートされたイメージの間の相互操作性の確認
第 11 章:OpenVMS Alpha コンパイラ
付録 A :アプリケーション評価チェックリスト
用語集
索引
PDF
OpenVMS ホーム
OpenVMS Alpha オペレーティング・システム | HPE 日本

OpenVMS Alpha
オペレーティング・システム
OpenVMS VAX から OpenVMS Alpha へのアプリケーションの移行


目次 索引

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

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

5.1 概要

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

  • 仮想メモリの割り当て

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

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

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

これらを実行するシステム・サービスやランタイム・ライブラリ・ルーチンは,メモリをページ単位で操作します。これらのルーチンに対する引数として値を指定する場合は,1ページが512バイトであるものと仮定しています。これはVAXアーキテクチャで定義されているページ・サイズです。Alphaアーキテクチャでは, 8Kバイト,16Kバイト,32Kバイト,または64Kバイトのページ・サイズをサポートします。したがって,ルーチンへの引数として指定する値を調べ,それらの値がアプリケーションの必要条件を満足するかどうかを確認しなければなりません。この後の節では,これらのルーチンを調べる方法について詳しく説明します。

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

5.1.1 互換性のある機能

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

注意

Alphaシステムでは,$CRMPSCシステム・サービスを使用して(さらにSEC$M_PFNMAPフラグ・ビットをセットして)ページ・フレーム・セクションを作成する場合には,ページ・カウント引数(pagcnt)に指定された値はCPU固有のページ・サイズとして解釈され,ページレットの値としては解釈されません



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

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

表 5-1 メモリ管理ルーチンでページ・サイズに依存する可能性のある部分
引数   Alphaシステムの動作
Adjust Working Set Limit ($ADJWSL) ルーチン
pagcnt 現在のワーキング・セット・リミットに加算される (またはワーキング・セット・リミットから減算される)ページ数を指定する。 値をページレットとして解釈し,CPU固有のサイズのページを表現するために切り上げるか,または切り捨てる。
wsetlm 現在のワーキング・セット・リミットの値を指定する。 値をページレットとして解釈し,CPU固有のサイズのページを表現するために切り上げるか,または切り捨てる。
Create Process ($CREPRC) ルーチン
quota 省略時のワーキング・セット・サイズ,ページング・ファイル・クォータ,ワーキング・セット拡張クォータなど,ページ・カウントを指定する複数のクォータ記述子を受け付ける。 値をページレットとして解釈し,CPU固有のサイズのページを表現するために切り上げるか,または切り捨てる。
Create Virtual Address ($CRETVA) ルーチン
inadr 割り当てられるメモリの先頭のアドレスと末尾のアドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1ページが割り当てられる。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
retadr 呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを指定する。 変更されない。
Create and Map Section ($CRMPSC) ルーチン
inadr 再びマッピングされる領域を定義する先頭アドレスと末尾アドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1ページがマッピングされる。ただし,SEC$M_EXPREGフラグが設定されている場合には,割り当てがP0空間であるのか, P1空間であるのかを判断し,その結果をもとに先頭アドレスが解釈される。 アドレスは CPU固有のページにアラインしなければならない(SEC$M_EXPREGフラグが設定されていない場合)。切り上げや切り捨ては実行されない(マッピングについての詳しい説明は 第 5.3 節 を参照)。
retadr 呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを指定する。 使用可能なアドレス範囲の先頭アドレスと末尾アドレスを戻す。これはマッピングされた合計サイズと異なる可能性がある。 relpag 引数を指定した場合には,この引数も指定しなければならない。
flags 作成またはマッピングされるセクションのタイプと属性を指定する。 フラグ・ビットSEC$M_NO_OVERMAPは,既存のアドレス空間をマッピングしてはならないことを示す。フラグ・ビットSEC$M_PFNMAPがセットされている場合には, pagcnt 引数はCPU固有のページとして解釈され,ページレットとしては解釈されない。
relpag セクション・ファイルのマッピングを開始するページ・オフセットを指定する。 セクション・ファイルへのインデックスとして解釈され,単位はページレットであると解釈される。
pagcnt マッピングされるファイル内のページ数 (ブロック数)を指定する。 ページレットとして解釈される。切り上げや切り捨ては実行されない。フラグ・ビットSEC$M_PFNMAPがセットされている場合には, pagcnt 引数はCPU固有のページとして解釈され,ページレットとしては解釈されない。
pfc ページ・フォルトが発生したときにマッピングしなければならないページ数を指定する。 CPU固有のサイズのページとして解釈される。この引数の値を指定する場合には,各物理ページに対して少なくとも 16ページレットがマッピングされることを考慮しなければならない。これは, Alphaシステムが8Kバイト,16Kバイト,32Kバイト,64Kバイトの物理ページ・サイズをサポートするからである。システムが物理ページより小さいサイズをマッピングすることはできない。
Delete Virtual Address ($DELTVA) ルーチン
inadr 割り当てが解除されるメモリの先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
retadr 削除されたメモリの実際の先頭アドレスと末尾アドレスを指定する。 変更されない。
Expand Program/Control Region ($EXPREG) ルーチン
pagcnt 512バイト単位で割り当てるメモリ・サイズを指定する。 ページレットとして解釈される。
retadr 呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを指定する。 変更されない。
Get Job/Process Information ($GETJPI) ルーチン
itmlst プロセスに関して戻される情報を指定する。 JPI$_WSEXTENTなど,多くの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。
Get Queue Information ($GETQUI) ルーチン
itmlst func 引数によって指定された関数を実行するときに使用される情報を指定する。 いくつかの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。
Get Systemwide Information ($GETSYI) ルーチン
itmlst 1つ以上のノードに関して戻される情報を指定する。 一部の項目はページレット単位の値として解釈される。SYI$_PAGE_SIZEという追加項目は,ノードがサポートするページ・サイズを指定する。詳しくは『OpenVMS System Services Reference Manual』を参照。
Get User Authorization Information ($GETUAI) ルーチン
itmlst ユーザのユーザ登録ファイルからどの情報が戻されるかを指定する。 一部の項目はページレット単位の値を戻す。詳しくは『OpenVMS System Services Reference Manual』を参照。
Lock Page($LCKPAG) ルーチン
inadr ロックされるメモリの先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
retadr ロックされたメモリの実際の先頭アドレスと末尾アドレスを指定する。 変更されない。
Lock Working Set ($LKWSET) ルーチン
inadr ロックされるメモリの先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
retadr 実際にロックされたメモリの先頭アドレスと末尾アドレスを指定する。 変更されない。
Map Global Section ($MGBLSC) ルーチン
inadr 再びマッピングされる領域を定義する先頭アドレスと末尾アドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には, 1ページがマッピングされる。ただし,SEC$M_EXPREGフラグがセットされている場合には,割り当てがP0空間で実行されるのか,P1空間で実行されるのかを判断し,その結果に従って先頭アドレスが解釈される。 アドレスはCPU固有のページにアラインしなければならない(SEC$M_EXPREGフラグが設定されていない場合)。アドレスの切り上げや切り捨ては実行されない(マッピングについての詳しい説明は 第 5.3 節 を参照)。
retadr 呼び出しの影響を受けたメモリの実際の先頭アドレスと末尾アドレスを指定する。 マッピングされたメモリの使用可能な部分の先頭アドレスと末尾アドレスを戻す。
relpag セクション・ファイルのマッピングを開始するページ・オフセットを指定する。 セクション・ファイルに対するインデックスとして解釈され,単位はページレットであると解釈される。
Purge Working Set ($PURGWS) ルーチン
inadr パージされるメモリの先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
Set Protection ($SETPRT) ルーチン
inadr 保護されるメモリの先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
retadr 保護されたメモリの実際の先頭アドレスと末尾アドレスを指定する。 変更されない。
Set User Authorization File ($SETUAI) ルーチン
itmlst ユーザのユーザ登録ファイルからどの情報を設定するかを指定する。 いくつかの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。
Send to Job Controller ($SNDJBC) ルーチン
itmlst func引数によって指定された関数を実行するときに使用される情報を指定する。 いくつかの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。
Unlock Page ($ULKPAG) ルーチン
inadr アンロックされるメモリの先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
retadr アンロックされたメモリの実際の先頭アドレスと末尾アドレスを指定する。 変更されない。
Unlock Working Set ($ULWSET) ルーチン
inadr アンロックされるメモリの先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。
retadr アンロックされたメモリの実際の先頭アドレスと末尾アドレスを指定する。 変更されない。
Update Section ($UPDSEC) ルーチン
inadr ディスクに書き込むセクションの先頭アドレスと末尾アドレスを指定する。 CPU固有のページになるように要求は切り上げられるか,または切り捨てられる。ディスク上の記憶空間によって表現される実際のアドレス範囲だけがディスクに書き込まれる。
retadr ディスクに書き込まれたメモリの実際の先頭アドレスと末尾アドレスを指定する。 CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。

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

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


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項 ウェブマスターに連絡