Terminate and Stay Resident

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

Terminate and Stay Resident (TSR) はMS-DOSなどのオペレーティングシステムにあるシステムコールの1つで、プロセスを終了させてシステムに制御を戻すが、そのメモリは残しておくという機能を提供する。しばしば、割込み(キー押下など)を契機として制御を戻すことで、擬似的なマルチタスクを実現するなどに使われた。このシステムコールを利用するプログラムも一般にTSRと呼ばれる。TSRプログラムには、OSがサポートしていないハードウェア用のデバイスドライバとして機能するものや、スケジューリングやアドレス帳などのよく使う小さなユーティリティプログラムなどがある。

背景[編集]

通常、DOSでは一度に1つのプログラムしか実行できない。実行中のプロセスが終了する場合、制御を親プロセスに戻すため、INT 21H/4CH というシステムコールを使う。そのプログラムが使っていたメモリは解放されるため、最初からロードする以外に再び呼び出すことはできなくなる。しかし、プログラム終了時にシステムコール INT 27HINT 21H/31H を使うと、DOSはそのプログラムのメモリを解放しないままプロセスを終了する。

TSRの使い方[編集]

システムコール INT 27H は 'Terminate But Stay Resident' と呼ばれるため、それを使うプログラムを 'TSR' と称した。これを使うと、プログラムは最大64KBのメモリだけをそのままの状態で残すことができる。MS-DOS 2.0 ではそれを改良したシステムコール INT 21H/31H ('Keep Process') が追加された。これは残すメモリ量の制限を外し、プロセスの終了コードを指定できるようにしたものである。このシステムコールを実行する前に、プログラムは1つ以上の割り込みベクタが自分自身を指すよう書き換え、再び呼び出されるようにする。ハードウェア割り込みベクタを書き換えると、ハードウェアのイベントにプログラムを反応させることができる。ソフトウェア割り込みベクタを書き換えれば、現在動作中のプログラムから呼び出すことができる。タイマー割り込みを使えば、TSRを定期的に呼び出すこともできる。

割り込みベクタを連鎖させれば、TSRプログラム群でコンピュータを完全に制御することもできる。TSRは次のどちらかの振る舞いを見せる。

  • ある割り込みを完全に独占し、それ以前に同じ割り込みベクタを書き換えていた他のTSRは呼び出さない。
  • 以前の割り込みベクタに従って、他のTSRを連鎖的に呼び出す。これは、そのTSR自身のコードを実行する前でも実行した後でもよい。この場合、TSR群によってプログラムの連鎖が形成される。

'Terminate and Stay Resident' はMS-DOSでのコンピュータウイルスでもよく使われ、PCの制御を奪ったり、バックグラウンドに潜んだりといった動きをした。すなわち、ディスクI/Oや実行イベントに対応してウイルスが動き、実行ファイル (.EXE や .COM) が実行されるときにそのファイルに感染したり、データファイルをオープンしたときにそのファイルに感染した。

一部のDOS自身、特にバージョン5.0以降では、この手法をいくつかの便利な機能を実現するのに使った。例えば、DOSKEY コマンド行エディタや他のコマンド行からインストール可能なユーティリティである(ドライバとしてCONFIG.SYSに記述する必要がなく、AUTOEXEC.BATに記述するか、通常のコマンド行から手入力で常駐させる)。

TSRプログラムはどの時点でもロードできる。OSのブート直後にロードするには、AUTOEXEC.BATに記述する。ユーザーが必要に応じてロードすることもできる(例えば、Sidekick や Turbo Debugger)。それらプログラムはTSRであるため、他のプログラムを実行中もメモリに留まっている。一般にTSRプログラムは自身をアンロードさせるオプションを提供しないため、リブートするまでメモリに常駐し続ける。しかし、外部からアンロードすることは可能で、TurboPower Software の MARK.EXE/RELEASE.EXE というユーティリティの組み合わせを使うか、soft reboot TSR を使って、特定のキーの組み合わせを押下することで全TSRをアンロードすることができる。

問題[編集]

TSRプログラムは非常に便利でDOSの限界を超える効力を発揮したが、同時に問題の種とも言われてきた。TSRプログラムはある意味でOSをハイジャックするものであり、TSRとアプリケーションの組合せや、TSR同士の組合せによってはシステムがクラッシュする事態が発生した。また上述したように、コンピュータウイルスにもTSRプログラムの形態をとるものもあり、それらは故意に問題を引き起こした。さらに、DOSシステムにおけるプログラムのコードは、たとえハードウェアに大量のメモリが搭載されていたとしても、メモリ空間の先頭640KBにロードしなければならなかった(コンベンショナルメモリ)。TSRも例外ではなく、先頭640KBにコードが置かれるため、アプリケーションが利用できるメモリ範囲がそのぶんだけ減ってしまう。したがって、TSRプログラムを作成する場合、第一にそのサイズをなるべく小さくしなければならず、さまざまなベンダーのソフトウェア製品との相性を調べなければならなかった。

1980年代末から1990年代初め、PC上の多くのコンピュータゲームはますますメモリを必要とするようになり、TSRに残されたメモリ領域はますます小さくなっていった。TSRを常駐させつつゲームに必要なメモリを確保するテクニックはどんどん難しくなっていった。多くのゲーマーはそれぞれのゲーム用に異なった構成設定のブートディスクを用意した。1990年代中盤以降もDOS向けゲームがいくつも登場して640KBの限界を突破し、先頭1MBより上位のメモリにゲームのデータやコードの一部を置き、オーバーレイとして下位1MBの領域にスワップインさせて実行するという技法が使われた。オーバーレイを多用したプログラミングは非常に複雑であるため、プログラムが約512KBを超える場合、1MBの制限を超えるもっと簡単な方法として、VCPIDPMIを実装したサードパーティ製DOSエクステンダが使われた。それによって、x86プロセッサがリアルモードからプロテクトモードに移行すると1MBを超える領域でコードを実行することができた。しかしDOSとDOSプログラムは全てリアルモードで動作するものであり(VCPIやDMPIはプロテクトモードのプログラムをDOSに対してリアルモードであるように見せる)、TSRやデバイスドライバもリアルモードで動作する。従って、それらに制御が渡る際には、DOSエクステンダはリアルモードに戻してから制御を渡す必要があり、時間的なペナルティが発生した。

復権[編集]

EMSボードと Intel 80386 プロセッサが1980年代後半に登場し、先頭640KBより上位のアドレスにTSRをロードできるようになった。これにはソフトウェアの複雑化(拡張メモリマネージャ)を伴ったが、数年間はこれで何とか間に合った。有名なメモリマネージャとしては、クォーターデックのQRAMQEMM、Qualitas の 386Max、コンパックCEMM、後発だがマイクロソフトEMM386などがある。TSRをロード可能な640KBより上位のメモリを "Upper Memory Block" (UMB) と呼ぶ。その後、メモリマネージャがTSRの最適配置を自動的に行い、先頭640KBをなるべく空けるようになった(クォーターデックの Optimize、マイクロソフトの memmaker)。

終焉[編集]

DOSエクステンダを使ったゲームが開発されるようになり(初期の例としてDOOMがある)、TSRに関連したメモリ容量問題の多くは解消された。そして Windows が広まり、特に Windows 95が登場すると、TSRの多くは不要となり、一部のTSRは非互換によって使えなくなった。ただし、Win16アプリケーションではTSR風の技法が可能で、IDTにパッチを当てるものもあった(リアルモードのWindowsでは可能だったため)。TSR はほとんど完全に消えてしまった。マルチタスク型のOS(Windows XPMac OS XLinuxなど)がPC向けにも登場し、複数のプログラムやデバイスドライバが同時並行して動作できるようになり、その際にTSRのような特殊な技法は不要となった。割り込みは、カーネルが独占的に処理するようになった。

Macintosh[編集]

実装は全く異なるが、似たような目的のものとして Macintosh のデスクアクセサリ (DA) がある。初期のMacintoshのOSはMS-DOSのようにシングルタスクで、その制限に対処するべくDAが生まれた。DAは任意の時点で動作中のアプリケーションの中で動作できる小さなプログラムで、「計算機」などがある。さまざまなサードパーティがアプリケーションをDAフォーマットで開発した。例えば、ワードプロセッサから抜け出さずに挿絵を描くためのお絵かきソフトなどがあり、擬似的なマルチタスクを実現していた。

関連書籍[編集]

  • H.シュルト 「第2章TSRプログラム作成」『実用Cプログラミング―生粋のCプログラマへ』 横山直樹訳、マグロウヒル出版、1990年(原著1989年)、第1刷。全国書誌番号:91039042ISBN 4895013960OCLC 47472397
  • 中島信行 『Cによるメモリ管理技法―MS-DOS上でTSRプログラム&デバイス・ドライバを作成する』 CQ出版社〈IFセレクション〉、1991年ISBN 4789834875
  • 田中尚 『速習MASM―初・中級者向けTSR作成の実際』 山海堂、1991年ISBN 4381090616OCLC 674574570
  • 川上峻史 『MS-DOSシステム・コールとCプログラミング』 工学図書、1991年。全国書誌番号:91067910ISBN 4769202415OCLC 674424185

関連項目[編集]

外部リンク[編集]