ダンプリスト解析入門⑤
ダンプリスト解析入門⑤:ダンプ解析に関連するOSコントロール・ブロック①
ダンプリストには、レジスター内容と関連する仮想記憶域の内容だけでなく、OSのさまざまなコントロール・ブロックが編集されて出力されます。これらもプログラムABEND時の原因究明のための有用な調査用資料になります。数多くのサブルーチンを動的にローディングしている、マルチ・タスキングで並行処理を行っている、OSのさまざまなAPIを使用している、などプログラムの構造や処理が複雑になるにつれ、OSのコントロール・ブロックはプログラムがどのような状態になっていたかを示す欠かせない情報になります。
RB(PRB,SVRB,IRB)
RB(Request Block)は、タスクで実行中のプログラムを管理するコントロール・ブロックです。OSは、システム制御のためのさまざまなリソースをコントロール・ブロックによって管理、制御しています。アドレス空間にはASCB、空間内のタスクにはTCB、タスクで実行されるプログラムにはRBが使われます。単純なプログラムではOSのコントロール・ブロックなど気にしなくてもデバッグできることが多いですが、このシリーズの「ダンプリスト解析入門②:ABEND箇所を特定する」でも紹介したように、ABEND時のPSWが自分のプログラム内を指していないような場合はRBを参照することで、複数プログラム間における制御の移り変わりの状況がわかります。
多くのコントロール・ブロックを理解する必要はありませんが、少なくともRBぐらいは知っておくといいでしょう。また、今日ではアセンブラー言語によるプログラミングはOSの出口ルーチンなどに限られてきています。出口ルーチンの処理を行う際、OSのコントロール・ブロックを参照することで必要な情報を得る場合もあります。基本的なコントロール・ブロックのアウトラインだけでも知っておけば応用が利きます。
RBには3つの種類があります。1つめはPRB(Program Request Block)で、LINKやATTACHなどスーパーバイザー経由で呼び出されるプログラムに対して作成されます。EXEC文のPGMパラメーターで指定されたプログラムにもPRBが作成されます。2つめがSVRB(SuperVisor Request Block)でSVCルーチンに対して作成されます。すべてのSVCについて作成されるのではなくタイプ2,3,4のSVCルーチンだけがSVRBを持ちます。3つめがIRB(Interrupt Request Block)で、非同期出口ルーチンに対して作成されます。例えば、ESTAE出口ルーチンは、ESTAEを発行したプログラムがABENDすると制御を受け取りますが、この時OSはESTAE出口ルーチンを割り込んで実行するためにIRBを作成します。
オフセット | フィールド名 | 意味、内容 |
-x20 | RBXSB | RBに入りきらない制御情報を格納するXSBへのポインター アクセスレジスターや64ビットレジスターの上位ワードなどはこちらに退避される。 |
-x03 | RBINLNTH | 割込み時の命令長 |
-x02 | RBINTCOD | 割込みコード (SVC番号やプログラム割込みコード) |
+x00 | RBBASIC | RB基本部の先頭 |
+x08 | RBSIZE | RBの長さ(ダブルワード数) |
+x0A | RBSTAB1 | 状況や属性を示すフラグバイト RBタイプ |
+x0B | RBSTAB2 | 状況や属性を示すフラグバイト x80:RBLINKはTCBを示す(タスクで最初に実行されたプログラム) |
+x0C | RBCDE | PRB:実行中プログラムのロードモジュールを管理するCDEへのポインター IRB:割り込んで実行されるモジュールの入口点アドレス |
+x10 | RBOPSW | 割り込み発生時のPSW |
+x1C | RBLINK | 1つ前のRBのアドレス |
+x20 | RBGRSAVE | 割り込み発生時の汎用レジスターの内容(GR0からGR15) (直前のRBで実行中のプログラムのもの) |
+x60 | RBEXSAVE | SVCルーチン用作業域(SVRBの場合で48バイト分) |
RBにはPSWとレジスターの退避領域があります。MVS(MSP,VOS3)では、複数のアドレス空間やタスクの実行を次々に切り替えて制御しますが、これらは割込みによって行われます。割込みが起きると、実行中のプログラムのRBにPSWが退避され、割込みによって実行される新しいプログラムのRBに割込み時に実行していたプログラムのレジスター内容が退避されます。PSWとレジスターは同じRBに退避されるのではないことを理解します。
例えば、プログラムがSVC命令を実行するとSVC割込みが発生し、PSWはPRBに退避され、レジスターはSVCルーチン用に作成されるSVRB(次のRB)に退避されます。STIMERマクロでタイマー設定中であれば、設定した時間が経過すると、実行中のプログラムの実行を中断してタイマー出口ルーチンを実行するためにIRBが作成されます。実行中プログラムのPSWがPRBに退避され、レジスター内容はIRBに退避されます。RBを順番にたどることで、割り込み発生時のPSWとレジスター内容を追跡することができます。
PRB: 009CEF98 -0020 XSB...... 7FFFEE10 FLAGS2... 00 RTPSW1... 00000000 00000000 -000C 00000000 FLAGS1... 00000000 WLIC..... 0002002F +0000 RSV...... 00000000 00000000 SZSTAB... 00110082 CDE...... 009EC6D8 +0010 OPSW..... 078D0000 87500EDE SQE...... 00000000 LINK..... 009EC080 ~~~~~~~~~~~~~~~~~~ 割り込み発生時のPSW(IRBで非同期出口ルーチンが実行された時のPSW) +0020 GPR0-3... FD000008 00006FF8 00000040 009D29D4 +0030 GPR4-7... 009D29B0 009EC818 009C1FE0 FD000000 +0040 GPR8-11.. 009EC6F8 009ECAD8 00000000 009EC818 +0050 GPR12-15. 00EE7A2A 00006F60 009EC744 009EC728 64-BIT GPRS FROM THE RB/XSB LEFT HALVES OF ALL REGISTERS CONTAIN ZEROS 0-3 FD000008 00006FF8 00000040 009D29D4 4-7 009D29B0 009EC818 009C1FE0 FD000000 8-11 009EC6F8 009ECAD8 00000000 009EC818 12-15 00EE7A2A 00006F60 009EC744 009EC728 +0060 RSV...... E3C5D4D7 D5C1D4F0 IRB: 009EC278 -0020 XSB...... 7FFFEC20 KEYSTA... 00 FLAGS2... 00 -0010 RTPSW2... 00000000 00000000 FLAGS1... 00000000 WLIC..... 000200CA +0000 PPSAV.... 8F9CDFA8 +0004 APSW..... 00000000 SZSTAB... 0013404E EPA...... 87500F5E OPSW..... 078D0000 87500F60 +0018 IQE...... 009EC2D8 LINK..... 009CEF98 +0020 GPR0-3... 93000000 11111111 22222222 33333333 --+ +0030 GPR4-7... 44444444 55555555 66666666 77777777 +--> 割り込み発生時の汎用レジスター +0040 GPR8-11.. 88888888 99999999 AAAAAAAA BBBBBBBB I (IRBで非同期出口ルーチンが +0050 GPR12-15. 07500E40 87500E50 80FC8308 00000000 --+ 実行された時のGPR) 非同期出口ルーチンが終了すると、 64-BIT GPRS FROM THE RB/XSB ここからレジスターが復元される。 LEFT HALVES OF ALL REGISTERS CONTAIN ZEROS 0-3 93000000 11111111 22222222 33333333 4-7 44444444 55555555 66666666 77777777 8-11 88888888 99999999 AAAAAAAA BBBBBBBB 12-15 07500E40 87500E50 80FC8308 00000000 +0060 RBNEXAV.. 00000000