SVC
SVC:スーパーバイザー・コール(Supervisor Call)
SVCルーチンとは
SVCとは簡単に言えば、OSのAPIを呼び出すための命令。SVCルーチンとはSVC命令によって呼び出されるプログラム・モジュール。MVSでもWindowsなどと同じように、メモリーの割り当てやI/Oの実行など、プログラムに必要なさまざな機能をプログラミング・サービスとして提供します。これらのサービスを呼び出す方法のひとつにSVC割込みがあります。SVC命令はSVC割込みを引き起こすための命令です。SVCによって割込みが発生し、割込みを処理するシステムルーチンが実行されて、割込みコードに対応するファンクションモジュールがサービスを提供するわけです。メインフレームではスーパーバイザー・コールと呼んでいますが、UnixやWindowsなどのシステムではシステム・コールと呼ばれる同様のしくみがあります(x86ではintあるいはsysenter命令)。
SVC割込みには0?255の256種類の割込みコードがあり、SVC番号と呼ばれます。基本的に1つのSVC番号が1つのサービス(機能)に対応しています。SVC 0はEXCP(チャネルプログラムの実行)、SVC 1はWAIT(非同期イベントの待ち合わせ)、SVC 2はPOST(非同期イベントの完了通知)、SVC 3はEXIT(プログラムの終了)など、OS自身が提供するサービスには0?199の割込みコードが使われています。200番以降はユーザーが独自の機能を提供するためのユーザーSVCルーチン用に使われます。
サービスを提供するSVCルーチンは機械命令によって直接呼び出されるため、呼び出し側は予めサービスルーチンをプログラムに結合したり、ローディングしておく必要はなく、外部参照の解決が必要ありません。呼び出しインタフェースに関して言えば、DLLによるAPIコールとは大きく異なります。ただしアセンブラ言語によるプログラムでなければ直接SVCサービスを利用することはできません。COBOLやPL/I言語のプログラムであれば、コンパイラーが提供する機能を使うか、アセンブラ言語のサブルーチンを呼び出して利用することになります。たいていのコンパイラーにはすべてのAPIの機能が提供されることはないので、足りないものやユーザーSVCを利用する場合は、アセンブラープログラムを組み合わせることになります。
拡張SVCルーチン
1つのSVC番号で複数の機能が実装されたSVCルーチンが拡張SVCルーチンです。ESR(Extend SVC Routine)とも呼ばれ、1つの拡張SVCには0?255の最大256種類の機能コードを割り当てることができます。元々200までしかないSVC番号では追加できる機能の数に限界があります。拡張SVCによってさらに多くの機能が追加できるようになっています。しかしESA以降のMVSでは新たな機能はクロスメモリーのしくみ(PC命令)によって実装されています。SVC 109が代表的な拡張SVCです。MSPとVOS3でも互換のため同番号で実装されていますが、すべての機能に互換はありません。またMSPではSVC 85という独自の機能を提供する拡張SVCもあります。基本のSVCは、そのほとんどが初期のMVSから実装されており、MVSとMSP/VOS3は互換を持ちますが、拡張SVCとPC命令によるサービスは必ずしも互換がありません。OSのマクロ命令が拡張SVCやPC命令によってサービスルーチンを呼び出していたら、互換は期待しない方がいいでしょう。
SVCルーチンは走行モードや呼ばれる環境に応じて複数の種類があり、SVCタイプと呼ばれます。SVCタイプやSVCルーチンがどのようなメカニズムで実行されるかなどについては、実際にSVCルーチンを作成する場合に必要な事なので、別のカテゴリーで記事を改めて解説します。