SVC:スーパーバイザー・コール(Supervisor Call)

SVC〔ルーチン〕とは

SVCとは、簡単に言えばOSのAPI(アプリケーション・プログラミング・インターフェース)を呼び出すための命令です。SVC命令によって呼び出されるのが、OSのSVCルーチンと呼ばれるプログラム・モジュールです。MVSでもWindowsなどと同じように、メモリーの割り当てやI/Oの実行など、プログラムに必要なさまざな機能をプログラミング・サービスとして提供します。これらのサービスを呼び出す方法の1つがSVC割込みです。
SVC命令は、SVC割込みを引き起こすための命令です。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ルーチンを作って利用することはほとんどなく、主にメーカーやベンダーのソフトウェア製品によって使用されています。

サービスを提供するSVCルーチンは機械命令によって直接呼び出されるため、呼び出し側は予めサービス・ルーチンをプログラムに結合したり、ローディングしておく必要はなく、外部参照を解決しておく必要ありません。呼び出しインタフェースに関して言えば、DLLによるAPIコールとは大きく異なります。ただし、アセンブラー言語によるプログラムでなければ直接SVCサービスを利用することはできません。COBOLやPL/I言語のプログラムであれば、コンパイラーが提供する機能を使うか、アセンブラー言語のサブルーチンを呼び出して利用することになります。たいていのコンパイラーにはすべてのAPIの機能が提供されることはないので、足りないものやユーザーSVCを利用する場合は、アセンブラー・プログラムを組み合わせることになります。

拡張SVCルーチン

拡張SVCルーチンとは、1つの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ルーチンを作成する場合に必要になる知識です。