HP OpenVMS OpenVMS Alpha から OpenVMS I64 へのアプリケーション・ポーティング・ガイド
4.8.9.1 SYS$LKWSET と SYS$LKWSET_64 の使用
プログラム自身をメモリへロックするのに SYS$LKWSET または SYS$LKWSET_64 を使用している場合には,これらを (OpenVMS Version 8.2 で導入された) LIB$LOCK_IMAGE という新しいライブラリ・ルーチンに置き換えることをお勧めします。同様に,SYS$ULWSET および SYS$ULWSET_64 も LIB$UNLOCK_IMAGE という新しいライブラリ・ルーチンに置き換えます (ただし,VAX システムで実行されるプログラムは,これらの新しいライブラリ・ルーチンを使用することはできません)。
カーネル・モードに入り,IPL を 2 より大きな値に上げるプログラムは,プログラム・コードとデータをワーキング・セット内にロックしなければなりません。コードとデータのロックが必要なのは,システムが PGFIPLHI バグ・チェックでクラッシュするのを回避するためです。
VAX システムでは通常,プログラムで明示的に参照されるコードとデータのロックだけが必要でした。 Alpha では,プログラムで参照されるコード,データ,およびリンケージ・データをロックしなければなりません。 I64 システムでは,コード,データ,ショート・データ,およびリンカで生成されたコードをロックする必要があります。ポーティングを容易にするため,また,ショート・データとリンカ生成データのアドレスはイメージ内で簡単に検出できないという理由から, Alpha と I64 の SYS$LKWSET および SYS$LKWSET_64 システム・サービスには変更が加えられています。
OpenVMS Version 8.2 では,SYS$LKWSET および SYS$LKWSET_64 システム・サービスは,渡された最初のアドレスを調べます。このアドレスがイメージの内部にある場合は,これらのサービスはイメージ全体をワーキング・セット内にロックしようとします。正常終了状態コードが返されると,システムが PGFIPLHI バグ・チェックでクラッシュすることなく,プログラムは IPL を 2 より大きな値に上げることができます。
ワーキング・セット内でイメージのロックが成功した回数を数えるカウンタが,内部 OpenVMS イメージ構造で管理されています。このカウンタは,ロックされたときに増分され,アンロックされたときに減分されます。カウンタが 0 になると,イメージ全体がワーキング・セットからアンロックされます。
特権プログラムが Alpha および I64 用であり VAX では使われない場合は,コード,データ,およびリンケージ・データを検索してこれらの領域をワーキング・セット内でロックするようなコードをすべて削除することができます。この種のコードは,LIB$LOCK_IMAGE および LIB$UNLOCK_IMAGE (OpenVMS Version 8.2 で提供) の呼び出しと置き換えることができます。これらのルーチンの方がプログラムにとって単純であり,コードの理解と保守も容易になります。
プログラムのイメージが大きすぎるために,ワーキング・セットでロックできない場合は,状態コード SS$_LKWSETFUL が返されます。この状態が返された場合は,ユーザのワーキング・セット・クォータを拡大することができます。また,イメージを 2 つの部分に分割することもできます。ユーザ・モードのコードを格納する部分と,カーネル・モードのコードを格納する共有イメージに分割します。カーネル・モード・ルーチンを開始するときに,このルーチンは LIB$LOCK_IMAGE を呼び出して,イメージ全体をワーキング・セットでロックしなければなりません。カーネル・モード・ルーチンを終了する前に,ルーチンで LIB$UNLOCK_IMAGE を呼び出す必要があります。
4.8.9.2 SYS$LCKPAG および SYS$LCKPAG_64 の使用
メモリでコードをロックするためにアプリケーションで SYS$LCKPAG あるいは SYS$LCKAPG_64 を使用している場合,このサービスの使用を再検討してください。 I64 では,このサービスはワーキング・セットのイメージ全体はロックしません。
コードが IPL を上げ,ページ・フォルトを発生することなく実行できるように,ワーキング・セットのイメージをロックしようとしているのかもしれません。 第 4.8.9.1 項 を参照してください。 LIB$LOCK_IMAGE および LIB$UNLOCK_IMAGE ルーチンについては『OpenVMS RTL Library (LIB$) Manual』を参照してください。
OpenVMS I64 のターミナル・クラス・ドライバのインタフェースは,コール・ベース・インタフェースです。これは,引数の受け渡しにレジスタを使用する OpenVMS Alpha の JSB ベースのインタフェースと大きく異なります。
OpenVMS I64 のターミナル・クラス・ドライバのインタフェースについては,『OpenVMS Terminal Driver Port Class Interface for Itanium』を参照してください。このドキュメントは以下の Web サイトで入手できます。
http://www.hp.com/products1/evolution/alpha_retaintrust/openvms/resources
|
保護されたイメージ・セクションは,通常,ユーザ作成のシステム・サービスを実装するための共有イメージで使用されます。
これらのイメージ・セクションは,ソフトウェアおよびハードウェアの機能によって保護し,特権のないアプリケーションがこれらのセクションの完全性を危うくすることがないようにします。 VAX および Alpha と I64 のハードウェアのページ保護機能の違いにより,わずかな制限が追加になりますので,保護されたイメージに対して変更が必要になる場合があります。
VAX および Alpha では,特権モード (カーネル・モードまたはエグゼクティブ・モード) で書き込み可能なデータ・セクションは,非特権 (ユーザ) モードで読み取りが可能です。そのようなページに対するハードウェア保護機能は,どのモードからも実行アクセスは許可しません。書き込み可能かつ実行可能としてリンクされた保護されたイメージ・セクションは,内部モードでの読み込み,書き込み,実行のみを許可し,ユーザモードでのアクセスは許可しません。内部モードでの書き込みが可能なデータへのユーザ・モード・アクセスも,書き込み可能セクションにコードを置くことも一般的ではないため, 1 つのセクションで両方を必要とするアプリケーションはほとんどないと考えられます。
このように VAX と Alpha では例外がありましたが, I64 では,すべての保護された書き込み可能イメージ・セクションは,ユーザ・モードでの書き込みから保護されます。保護されたイメージ・セクションに対するユーザ書き込みを許可する場合は,$SETPRT/$SETPRT_64 を使ってページ保護を変更する必要があります。
|