OS内で稼働中のアドレス空間を求める
OS上で動作しているジョブの一覧を作る、などアクティブなアドレス空間をリストアップしたい場合がある。例えば、SDSFのDAコマンドやMVSコマンドのD A,Lで得られるようなリストである。
MVSではアドレス空間はASCBと呼ばれる制御表で管理されており、ASCBは共通域であるSQAに展開されているのでどの空間からでもアクセスできる。ASCBを順番に参照することで、どのようなアドレス空間(ジョブ)が存在するかを(実行されているかを)求めることができる。
各空間のASCBのアドレスはASVTと呼ばれるテーブルからポイントされている。ASVT内では、空間ID(ASID)順にASCBアドレスが格納された4バイトのフィールドが並んでおり、このフィールドを参照することで順番にあるいは直接に目的のアドレス空間のASCBを求めることができる。
ASVTそのもののポイント方法やASVTの構造は、MVS、MSP、VOS3共に似ているので、ほぼ同じロジックで参照することができるが、テーブルそのものの構造はそれぞれ微妙に異なる。特にMSPはMVSとVOS3と大きく異なる点がある。
アクティブなアドレス空間の求め方
MVSとVOS3
: L R2,CVTPTR LOAD CVT L R2,CVTASVT-CVT(,R2) LOAD ASVT USING ASVT,R2 ADDRESS IT L R3,ASVTMAXU LOAD MAXIMUM ASID NUMBER FINDASCB DS 0H TM ASVTENTY,ASVTAVAL IS THIS ASSIGNED ASCB ? BO NEXTASCB NO, IGNORE THIS ENTRY L R7,ASVTENTY LOAD NEXT ASCB USING ASCB,R7 ADDRESS IT SPACE , GR7に次のアクティブ空間のASCBアドレスが格納されている。 ここに必要な処理を追加する。 空間のジョブ名は次のロジックで求めることができる。 ICM R8,B'1111',ASCBJBNI LOAD BATCH JOBNAME POINTER BNZ *+4+4 IF NZERO, MAY BE BATCH L R8,ASCBJBNS LOAD STC/TSO JOBNAME POINTER アイドル状態のイニシエーターも含まれる SPACE , NEXTASCB DS 0H LA R2,4(,R2) LOCATE NEXT ASCB ENTRY BCT R3,FINDASCB TRY TO NEXT : : CVT DSECT=YES IHAASVT , VOS3ではJAAXASV IHAASCB , VOS3ではJAAASCB :
ASVTはCVTからポイントされている。ASVTのASVTMAXUにはASVT上の最大空間(ASCB)数が入っていて、ASCBアドレスののフィールドはASVTENTYからASID順に並んでいる。ASVTENTYが示すのが先頭のASCBでASID=1のアドレス空間である。ASVTENTY+4の位置にあるフィールドがASID=2の空間のASCBアドレスが格納されている。ASIDがわかっていて、その空間のASCBを直接求めるのであれば、ASIDから1を減じて4を掛けた値をASVTENTYからのオフセットとして参照すればよい。
ASCBアドレスの格納フィールドの先頭ビットはアクティブ・インジケーターである。このビットが0であれば、対応するアドレス空間はアクティブでそのフィールドにはASCBアドレスが格納されている。ビットが1であれば、どのジョブにも割り当てられていない空間であることを示す。
MVSとVOS3ではASVT自体の構造には違いがあるが、アクティブなアドレス空間を求めるために参照するフィールドについては同じである。ただしフィールド・オフセットは異なるので、ロードモジュールでの互換はない。MVSはMVS、VOS3はVOS3のマクロでアセンブルしなければならない。
MSP
: L R2,CVTPTR LOAD CVT L R2,CVTASVT-CVT(,R2) LOAD ASVT USING ASVT,R2 ADDRESS IT LH R3,ASVHMAX LOAD MAXIMUM ASID NUMBER FINDASCB DS 0H TM ASVTENTY,ASVTAVAL IS THIS ASSIGNED ASCB ? BNO NEXTASCB NO, IGNORE THIS ENTRY L R7,ASVTENTY LOAD NEXT ASCB USING ASCB,R7 ADDRESS IT SPACE , ICM R8,B'1111',ASCJBNI LOAD BATCH JOBNAME POINTER BNZ *+4+4 IF NZERO, MAY BE BATCH L R8,ASCBJBNS LOAD STC/TSO JOBNAME POINTER SPACE , NEXTASCB DS 0H LA R2,4(,R2) LOCATE NEXT ASCB ENTRY BCT R3,FINDASCB TRY TO NEXT : : CVT DSECT=YES KAAASVT , VOS3ではJAAXASV KAAASCB , VOS3ではJAAASCB :
MSPもCVTからASVTをたどり、ASVT内ではASVTENTYフィールドを起点にしてASID順にASCB格納フィールドが並ぶ点では同じあるが、ASVT上の最大空間数が格納されているフィールドがフルワードではなくハーフワードになっている(名称も異なる)ことと、アクティブ空間を示すインジケーター・ビットの意味が逆になっている(MSPの場合、ビットが0ならアイドル、1ならアクティブであることを示す)ことに注意する。
2 Responses to “OS内で稼働中のアドレス空間を求める”
Comment from arteceed
Time 2012年4月5日 at 08:30
2.ASVTからだと漏れなく参照できる(はず)と理解しています。全空間のリストアップであればASID順でわかりやすいのもあります。
CVTASCBL/CVTASCBHはディスパッチ順序に関連したASCBキューのポインターなので、全空間のリストアップという目的で使うのにはそぐわないかと。
アセンブラー・プログラミング勉強中とのことでもありますので、CVTからのポイントでASCBチェインをたどって、それぞれの実行結果を比べられると具体的に違いがわかると思います。
3.もちろんサンプル以外の方法であっても目的が果たせればいいでしょう。使いやすいものを選べばよいと考えます。
紹介した方法は自分が扱っていた商用ソフトのロジックから得た方法ですが、IBMのSDSFのDAコマンドでもASVTからASCBを求めています。
Comment from masu
Time 2012年4月5日 at 00:26
「アクティブなアドレス空間の求め方」の例で2点質問させていただけますでしょうか。
上記の例では、「L R2,CVTPTR」と一気にCVTを参照していますが、実際は、CVTの先頭アドレスをPSAのFLCCVT等から引っ張ってくる必要がある部分を省略している、という理解でよろしいでしょうか。
また、ASCBを求めるのであれば、CVTのCVTASCBLにて直接アドレスが分かりますが、ASVTを経由して算出している理由がありましたらご教示いただけますと幸いです。
IBM提供のマニュアル(MVS Data Areas Volume 1 (ABEP-DCQ))を見る限り、ASCBのPointed to byは多数ありましたので、複数ある算出ロジックのうちの一つ、ということでしょうか。