アンカーポインターの持ち方
アンカーポインター(Anchor Pointer)をどこに持つかはシステム・プログラムにおいては重要なデザインとなる。有名なものにCVTUSERがあるが1つしかないため事実上使ってはならないフィールドである。タスク単位なら古くからTCBUSERが使われたりしたが空間単位となるとASCBにはユーザーフィールドはなかったりする。サブシステムテーブル(SSCT)を使ってみたり、いろいろな工夫がされてきた。
MVSではESA Ver4以降で提供された「Name/Token Service」と言うサービスを使えば、タスク単位、アドレス空間単位、システム共通と用途に応じたアンカー領域を持つことができる。Name/Tokenは16バイトの名前と、対になった16バイトのトークン(名前に対する任意の内容を入れておける)で構成される。名前とトークンのフィールドはアドレスを指定して直接アクセスするのではなくMVSのAPIを通して間接的にアクセスされる。これを使えばプログラムが独自のアンカーポインターを持つことが容易です。割込み禁止状態で動くような特殊なプログラムを除けば、ロック保持ルーチンやSRBルーチンなどでも利用可能です。
MVSだけで動くプログラムならいいが、MSPとVOS3には同等の機能がない。そこで3つのOSに共通な方法を考えてみる。OSの制御表の未使用フィールドを取りあえず使う、と言った後で問題になるような方法は取らない。
TCBUSER
TCBUSERはタスク毎に利用できる4バイトのユーザーフィールドである。ここにプログラムで使うコントロールブロックのアドレスを入れてアドレスポインターとして使うようなことは昔から行われてきた。タスクに1つなのでマルチタスキング・プログラムでは、例え空間内で共通に使われるリソースであってもそれぞれのタスクで値を設定しなければならない。欠点はキー0でなければ書き込みできないこと。
TCBFSAからポイントされる最初の18ワードのSAVEAREAを使用する方法
TCBFSAからポイントされる1stセーブエリアの+0,+4の2つのフルワードは通常使用されないのでここにアンカー情報を格納する。+4は呼び出し元モジュールのセーブエリア・ポインターだが1stセーブエリアなので使われていない。TCBUSERの代わりに使うなら先頭ワードのみをポインター領域にすればいい。OSが用意した領域だがジョブステップ・キーのままで書き込みできるので、NON-AUTH(非APF)のプログラムでも利用できる。
ロードモジュールを使用する方法
アドレス空間に固有なアンカーを、OSの制御表を使わず他のソフトとの競合もしない方法としてロードモジュールを使用する。任意の名前でアンカーに必要な大きさのモジュールを作る。そのモジュールをローディングしてモジュール内の適当な位置に必要な情報を書き込む。モジュール内のどこに何の情報が入っているかはプログラム側で取り決めればよい。参照するプログラムは、そのアンカーモジュールの入口点アドレスをJPQから求める。ジョブステップ・タスクのTCBからCDEをたどれば求められる。(TCBJPQ → CDE → XTLST)アンカーモジュールはサブタスクでLOADされてもかまわない。LLEチェインはタスク単位だが、JPQはジョブ単位なのでサブタスクでLOADされてもJPQからたどることができる。