=============================================================================== emxrt.doc emx 0.9d FIX 03 USER'S GUIDE TO THE EMX RUNTIME 29-Apr-2000 =============================================================================== Copyright (c) 1990-2000 by Eberhard Mattes
これは emx ランタイムパッケージのためのドキュメントです。 emx ランタイムは、386 CPU(もしくはそれ以降のもの)搭載マシンの OS/2 2.x と OS/2 3.x(OS/2 と略す)、そして MS-DOS と PC DOS(DOS と略す)のもとでの、32ビットプログラム実行環境です。
OS/2 では、以下のように入力し、本ドキュメントの .inf 版を見ることができます。
view \emx\book\emxrt
環境変数 BOOKSHELF に \emx\book を追加してあれば、以下のように入力することでオンラインブックを閲覧できます。
view emxrt
emx は 80386 CPU(30886DX、80386SX、i486 もしくはそれ以降)を必用とします。
emx ランタイムパッケージは以下のファイルを含んでいます。
\emx\bin\emx.exe DOS 用の emx ランタイム \emx\bin\emxbind.exe emx 用プログラム設定ツール (DOS, OS/2) \emx\bin\emxfpemu 数値演算プロセッサのエミュレータ (DOS) \emx\bin\emxl.exe emx ローダ (emxbind が使用) \emx\bin\emxload.exe OS/2 プログラムのメモリ常駐用サーバ \emx\bin\emxrev.cmd emx リビジョン表示ツール (OS/2) \emx\bin\emxstack.exe 旧プログラムのスタックサイズ修正ツール \emx\bin\emxupd.exe 使用中 DLL の更新ツール \emx\bin\emxuzdll.cmd emxpud を使い、DLL 展開およびインストールを行う \emx\book\emxrt.inf あなたが読んでいるこのテキスト (VIEW 版) \emx\dll\emx.dll OS/2 用の emx ランタイム \emx\dll\emxio.dll OS/2 下での I/O ポートアクセスサポート \emx\dll\emxlibc.dll emxlibcm.dll への転送 DLL (forwarder DLL) \emx\dll\emxlibcm.dll マルチスレッド C ライブラリ (OS/2) \emx\dll\emxlibcs.dll シングルスレッド C ライブラリ (OS/2) \emx\dll\emxwrap.dll 16-bit OS/2 ファンクションへのインターフェース \emx\doc\COPYING GNU General Public License \emx\doc\COPYING.EMX emx コピーライト情報 \emx\doc\emxrt.doc あなたが読んでいるこのテキスト (テキスト版) \emx\etc\termcap.dat termcap を使うプログラムのための端末データベース \emx\etc\emclibcm.map emxlibcm.dll のマップファイル \emx\etc\emclibcm.tdf emxlibm.dll トレース定義ファイル \emx\etc\emclibcs.map emxlibcs.dll のマップファイル \emx\etc\emclibcs.tdf emxlibs.dll のトレース定義ファイル \emx\etc\trc00f8.tff emxlibcs.dll のトレースフォーマットファイル \emx\etc\trc00f9.tff emxlibcm.dll のトレースフォーマットファイル
.map、.tdf、.tff ファイルはデバッグ時に用います。 これらのファイルが emxrt.zip 内に収められているのは、DLL との整合性を保つためです。
(訳注:この部分は原文そのまま)
emx is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.
emx is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with emx; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
See \emx\doc\COPYING.EMX and \emx\doc\COPYING for details.
Please note that source code for parts of the contents of emxrt.zip is contained in emxfix03.zip.
OS/2 バージョン 1.x、そして OS2 の DOS モードでは emx は動作しません。
config.sys を変更する前にバックアップコピーを取っておくこと!
0.9c 以上の emx は、Siegfried Hanisch のスクリーンセーバを破壊します。 0.9c 以上の emx をインストールする前に、スクリーンセーバをバージョン 2.6 にアップグレードするか禁止してください。 さもないとシステムがフリーズします。
OS/2 下では、emx ランタイムはダイナミックライブラリの集合体として実装されています。
config.sys 中の LIBPATH ステートメントに記載されたディレクトリ中から、OS/2 はダイナミックリンクライブラリを探します。 LIBPATH が環境変数でないことに注意!
いつでもたいてい、単一のバージョンのダイナミックライブラリがロードされます。 LIBPATH ステートメントに記載されたディレクトリ中に、異なるバージョンのダイナミックリンクライブラリがある場合、先頭に記載されたディレクトリにあるものがロードされます。 すでに emx のダイナミックリンクライブラリがインストールされている場合、最終リビジョンのダイナミックリンクライブラリを使うように心がけてください。 以前の emx プログラムは新しい emx ダイナミックリンクライブラリで動作しますが(emxstack を当てる必用があるかもしれませんが)、新しい emx プログラムは古い emx ダイナミックリンクライブラリで動作しません。 インストール済の emx ダイナミックリンクライブラリについて調べるには、
cd \emx\binと入力します。 もし emx のダイナミックリンクライブラリが何もインストールされていなければ、何も出力されません。 インストールされた emx ダイナミックライブラリがあれば、例えばこんな風に、名前とリビジョン番号が表示されます。
emxrev
EMX : revision = 30
EMXIO : revision = 30
EMXLIBC : revision = 30
EMXLIBCM : revision = 30
EMXLIBCS : revision = 30
EMXWRAP : revision = 30
LIBPATH ステートメント中に記載されたディレクトリのみが検索されます。 もし C ドライブに emx ランタイムパッケージを置いているのであれば、以下のように入力して、そのパッケージのダイナミックリンクライブラリのリビジョン番号を調べます。
emxrev -d c:\emx\dll
emxrev 実行後、ダイナミックリンクライブラリを解放するため、
quitと入力して、コマンドプロセッサを終了します(emxrev は REXX 手続きですので、ライブラリは cmd.exe によってロードされています)。 さもないと、それらのファイルをリネーム、上書き、削除できません。 あるプログラムによって emx ダイナミックリンクライブラリのひとつが使用中の場合、これと同じことが起こります。 もし emxrt.zip の展開時に、SYS0032 エラーメッセージ、もしくは
error: cannot create emx/dll/emx.dllというメッセージを unzip から受け取ったら、
pstat /Lを使って、現在動作中のプログラムが使っているダイナミックリンクライブラリを調べてください。 emx.dll, emxio.dll, emxlibc.dll, emxlibcm.dll, emxlibcs.dll, emxwrap.dll を使っているすべてのプログラムを終了してください。
emxload -qwで、emxload.exe によってメモリに常駐したプログラムがアンロードされます。
それでもだめなら、emxuzdll を使って emx の DLL をインストールします。 作業用ディレクトリを作成し、emxrt.zip のパス名と emx の DLL をインストールするディレクトリ名を与えた上で、作業用ディレクトリで emxuzdll をコマンドラインから実行します。
mkdir \emxtmp
chdir \emxtmp
emxuzdll a:\emxrt.zip c:\emx\dll
chdir ..
rmdir emxtmp
これで、DLL が使用中であっても、c:\emx\dll 中の DLL が emxrt.zip 中の DLL で置き換えられます。 DLL を参照する最後のプロセスが終了した直後、もしくは次回の再起動時に、新版の DLL が有効になります。 ですから、emxuzdll 実行後は再起動すべきで、そうしないと新版がいつ有効になるのかわかりません。 (本当のところ、作業用ディレクトリは必用ではなく、DLL がひとつもないディレクトリでなら大丈夫でしょう)
emx ダイナミックライブラリの最終リビジョン版(つまり、番号がいちばん大きいもの)を config.sys の LIBPATH ステートメントに記載されているディレクトリにコピーするか、できれば、LIBPATH ステートメントを変更して、emx ダイナミックリンクライブラリの最終リビジョン版が置いてあるディレクトリを入れてください。
LIBPATH ステートメントのディレクトリはセミコロンで区切られています。 LIBPATH ステートメントに c:\emx\dll を追加するため、config.sys の
LIBPATH=で始まる行の終わりに――まだセミコロンがなければ――セミコロンをつけ足します。
そして、ディレクトリの絶対パスを入力します。 例:
LIBPATH=.;C:\OS2\DLL;C:\OS2\MDOS;C:\;C:\OS2\APPS\DLL;D:\EMX\DLL
なんでしたら、最後尾にセミコロンをつけることもできます。
次に、config.sys の
SET PATH=で始まる行を変更して、\emx\bin ディレクトリを入れます。 たとえば、
これを、このように変えます。SET PATH= C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS\WINOS2;C:\OS2\INSTALL;C:\;C:\OS2\MDOS;C:\OS2\APPS
SET PATH= C:\OS2;C:\OS2\SYSTEM;C:\OS2\MDOS\WINOS2;C:\OS2\INSTALL;C:\;C:\OS2\MDOS;C:\OS2\APPS;D:\EMX\BIN
LIBPATH でのように、パス名ごとの間にセミコロンを置かねばならず、最後尾のセミコロンは任意です。 最後の2例が2行で表わされている点に注意してください。 config.sys 中では、しかしながら、正しい SET ステートメントは1行に収めなければなりません。 (訳注:原文のプレーンテキスト中では、上の2例がそれぞれ2行に分かち書きされていた)
オンライン文書を簡単に見るため、環境変数 BOOKSHELF に \emx\book を追加したくなるかもしれません。 たとえば、config.sys ファイルの
SET BOOKSHELF=C:\OS2\BOOK;の行を以下のように変えます。
SET BOOKSHELF=C:\OS2\BOOK;D:\EMX\BOOK
PATH でのように、パス名ごとの間にはセミコロンを置かねばならず、最後尾のセミコロンは任意です。
それでは、再起動して config.sys の内容を有効にしましょう。 再起動後、
emxrevを実行して emx の最新版が有効になっているか確認してください。
もし OS/2 が、
SYS1804: ファイル EMX が見つかりませんと言ってきた場合、config.sys の LIBPATH ステートメントが正しく設定されていません。 上記の内容をよく確認してください。
古いプログラム(スタックサイズが小さすぎる場合、emx.dll がスタックオブジェクトを作成すると仮定しているもの)の実行時、以下のようなエラーメッセージを受け取ります。
emx.dll: Stack size too small. Run
emxstack -f D:\BIN\PROGRAM.EXE
and try again.
エラーメッセージの指示通り emxstack を実行し、プログラムのスタックサイズを修正してください。 もし(ファイル書き込み権限がないので)それができない場合は、
set emxopt=-Iと入力し、emx.dll にこの問題を無視させます。 しかし、スタックサイズ不足により、プログラムはおそらくクラッシュします。 -I オプションの使用はおすすめいたしません!
DOS 版の emx プログラムには2種類あります。 別ファイルの emx.exe を読み込むものと、アプリケーションプログラムの実行ファイル中に一体化された emx ランタイムの emx.exe を持つものです。
config.sys と autoexec.bat 変更の前に、これらのファイルをバックアップコピーしておくこと!
emx.exe を読み込むプログラムを利用したい場合、emx.exe を環境変数 PATH に示されたディレクトリ内に置くか、(autoexec.bat 中の)環境変数 PATH を変更し、emx.exe のあるディレクトリを含めなければなりません。 仮に、autoexec.bat ファイルが
path c:\dos;d:\binという行を含み、emx ランタイムを D ドライブにインストールしてある場合、この行を以下のように変更します。
path c:\dos;d:\bin;d:\emx\bin
パス名の間にはセミコロンを置かねばなりません。
そのかわりに環境変数を設定し、実行ファイル emx.exe を直接指定することもできます。 この方法を使うと、プログラムはより迅速に emx.exe の位置を確定できます。 emx ランタイムを D ドライブにインストールした場合、autoexec.bat ファイルに以下の行を追加してください。
set emx=d:\emx\bin\emx.exe中途半端なディレクトリ名にはご注意を――emx.exe の完全なファイル名を入力しなければなりません。
二番目の種類のプログラムは、emx.exe と一体化しており、環境変数 PATH に \emx\bin を追加したり、環境変数 EMX を設定したりする必要のないものです。 このプログラム自体は、しかしながら、autoexec.bat の変更を必用するかもしれません。 プログラム付属のドキュメントを見てください。 それら両方の種類のプログラムに必要とされるステップを以下に示します。
もし(QEMM、EMM386、386Max のような)メモリマネージャを使っていて、それが DPMI(DOS Protected Mode Interface)を実装している場合、emx は DPMI をサポートしていないので、そのメモリマネージャの設定を変更して VCPI を有効にしてください。 詳細はあなたのマシンのメモリ環境のドキュメントを見てください。 メモリマネージャが DPMI だけしかサポートしていない(VCPI も)場合、メモリマネージャを取り除くか無効化しておかねばなりません。 別の方法として rsx を使うことができますが、これは 6.3 章に示します。 emx は XMS と VCPI をサポートしています。
config.sys ファイルを確認しましょう。
BREAK=ONもしこのような行があったなら、この行は emx ならびにその他の多くのプログラムでトラブルを引き起こすので、取り除いておくべきでしょう。
もし、ほんとうにもし、8088 ペースの PC で `Intel Inboard 386/PC' の拡張ボードをお使いになっていたら、autoexec.bat に以下の行を追加してください(このような拡張ボードを使っているというのは、ほとんど考えられないことですが)。
set emxopt=-m3
指定したディレクトリ、あるいは指定したドライブにスワップファイル(物理メモリを使い切ったとき、メモリページをディスクに待避するために使う)を置きたい場合は、autoexec.bat にて環境変数 EMXTMP を設定します。 例:
set emxtmp=c:\tmp
それでは、再起動して config.sys と autoexec.bat への変更を有効にしましょう。
いくつかの環境変数によって、emx および emx を使うプログラムの動作が制御されます。 以下のうちひとつ以上の環境変数を設定しなければならないこともあります。
環境変数 TZ は、現地時間から協定世界時(UTC 別名グリニッジ平均時 GMT)を計算する方法を統括します。 (注記すると、Unix ではシステムクロックに UTC が用いられるので、UTC から現地時間への計算に TZ を使います。 OS/2 と DOS では、システムクロックに現地時間が用いられます)
TZ の内容は以下のような書式となります。
<TZ1>[<OFF>,[<TZ2>[,<SM>,<SW>,<SD>,<ST>,<EM>,<EW>,<ED>,<ET>,<SHIFT>]]]
<TZ1> は3文字の標準時名です。
<OFF> は UTC へのオフセット値で、正の値は本初子午線の西、負の値は本初子午線の東となります。 オフセット値は、時、時:分、もしくは時:分:秒で指定されます。 時、分、秒はコロンで区切ります。 <OFF> が指定されていない場合、オフセット値 0 が使われることになります(将来変わるかもしれません)。
<TZ2> は3文字の夏時間名です。 <TZ2> が指定されていない場合、夏時間は使われません。 <TZ2> が指定された場合は夏時間が使われ、TZ の残りの部分は、夏時間への変更および復帰の時期と方法を指定します。 <SM> から <ST> までは標準時間から夏時間へ切り替わる時期を現地時間で定め、<EM> から <ET> までは夏時間から標準時間へ切り替わる時期を現地時間で定めます。 (南半球では、夏時間終了日のほうが、開始日よりも前の日付になります) <SHIFT> は時間をずらす秒数です。
<SM> は切替え月を(1 から 12 で)指定します。 <SW> は切替える週を指定し、これがゼロの場合、<SD> はその月の何日めかを指定します(1 から 31 で)。 <SW> が正(1 から 4)の場合、指定月の <SW>週目の <SD>曜日(0 = 日曜 から 6 = 土曜)に夏時間へ切り替わります。 最初の日曜日のある週が、その月の最初の週とみなされます。 <SW> が負(-1 から -4)の場合、指定月月末から数えて -<SW>週目(つまり、-1 はその月の最後の週を表わす)の <SD>曜日(0 = 日曜 から 6 = 土曜)に夏時間へ切り替わります。 最後の日曜日のある週が、その月の最後の週とみなされます。 <ST> は夏時間に切り替える時刻を秒数で指定します。 注意してほしいのは、<ST> が現地の標準時間で指定され、<ET> が現地の夏時間で指定されることです。 例を挙げます:
CET-1CED,3,-1,0,7200,10,-1,0,10800,3600
この例では、標準時名が CET、夏時間名が CED です。 夏時間は3月最後の日曜の午前 2:00 に始まり、10月最後の日曜の午前 3:00 に終わります。 夏時間のあいだ、時刻は1時間ずれます。
<TZ2> の後に文字が続かない場合、`,4,1,0,3600,10,-1,0,7200,3600' が使われることになり、4月の最初の土曜日の午前 1:00 から夏時間が始まり、10月最後の日曜の午前 2:00 に終わります。 夏時間のあいだ、時刻は1時間ずれます。
Nonmaskable interrupt (NMI)というメッセージを表示したら)、保護レベル (protection level) を 0 にセットするか、QEMM-386 の WATCHDOG=0 オプションを使うこと
もし emx 動作中にコンピュータがフリーズした場合、Ctrl-Break を1秒間に5回叩いてみてください。 DOS コール処理中で、Ctrl-Break 処理がブロックされていなければ、それで emx(および emx によって実行されたすべての emx プロセス) が終了します。 DOS コール処理中でブロックされている場合、DOS コールからの復帰後に emx が終了します。
rsx は DPMI 依存の DOS エクステンダで、emx とほぼ互換性があります。
さらに、rsx は浮動小数点エミュレータを内蔵しています。
rsx はフリーソフトウェアで、Rainer Schnittker によって書かれました。
これを書いている時点では、以下の anonymous ftp で rsx が入手可能です。
ftp.uni-bielefeld.de: /pub/systems/msdos/misc/rsx510.zip ftp.leo.org: /pub/comp/os/os2/leo/gnu/emx+gcc/contrib/rsx510.zip
emx ローダ emxl.exe が DPMI サーバを発見し、しかし VCPI サーバがない場合は、 emx.exe のかわりに rsx.exe を実行しようとします。 rsx.exe の位置指定には、環境変数 EMX のかわりに環境変数 RSX が使われます。
DPMI サーバと VCPI サーバが存在していても、emx.exe のかわりに rsx.exe をロードするには(たとえば rsx の浮動小数点エミュレーションが必要な場合)、rsx.exe を指すように環境変数 EMX を設定します。 rsx が DPMI サーバを必用とすることに注意してください。
(訳注:ここに書かれた rsx のバージョンはだいぶ古く、該当ファイルはもう存在しません。
rsx の最新版は RSXNT や RSXNTDJ のパッケージ中に含まれています。
Rainer Schnittker 氏のページ
http://www.mathematik.uni-bielefeld.de/~rainer/
その他で公開されています)
環境変数 EMXOPT を設定して、emx をカスタマイズできます。 この環境変数はコマンドラインオプションと同様のオプションリストを格納します。 オプションはすくなくともひとつの空白で区切らなければなりません。 例を挙げます:
set emxopt=-c -h40
emxstack はスタックサイズの表示と修正のために使用されます。 スタックサイズが小さすぎる場合に emx.dll がスタックオブジェクトを確保することを、昔のプログラムでは想定しています。 emx.dll はもうそのようなことを行わないので、そういったプログラムのスタックサイズを修正しなければなりません。
emxstack <コマンド> [<オプション>] <ファイル>...
使用可能なコマンドは以下の通りです:
使用可能なオプションは以下の通りです:
例:
emxstack -f *.exe
現在使用中の DLL を、emxupd で入れ替え(および削除)できます。 (EXE ファイルに対しても) その DLL を現在使っているすべてのアプリケーションが終了するまで、古いバージョンの DLL はそれを使うプログラムによって使用状態に置かれ、メモリ内にとどまります。 そして終了後、新しい DLL が使われるようになります。 新しい DLL には再起動することでも切り替わります。
DLL を入れ替えるには、以下のように入力します。
emxupd <元ファイル> <出力パス>
このコマンドで、<元ファイル> を <出力パス> のディレクトリに(もしくはそのファイル名で)コピーします。 例:
emxupd c:\tmp\emx.dll c:\emx\dllこのコマンドでは c:\tmp\emx.dll を c:\emx\dll\emx.dll にコピーします。
emxupd abc.dll d:\dll\new.dllこのコマンドでは abc.dll を d:\dll\new.dll にコピーします。
DLL を削除するには、以下のように入力します。
emxupd -d <削除ファイル><削除ファイル> は、削除する DLL のパス名です。
ZIP ファイル中の全 DLL を展開し、DLL が使用中でも emxpud で入れ替えつつ、単一のディレクトリにインストールするには、以下のように入力します。
emxuzdll <ZIPファイル> <DLLディレクトリ><ZIPファイル> は DLL 展開元の ZIP ファイルのパス名で、<DLLディレクトリ> は ZIP ファイルの 全 DLL を置くディレクトリです。 emxuzdll を使えるのは、カレントディレクトリに DLL ファイルがひとつもない場合だけです。
この章では、emx ランタイムにかかわる、ありがちな不具合の解決法を示します。
このメッセージが出た場合、現行バージョン以前の emx.dll が動作状態になっています。 emx.dll の最新版が config.sys の LIBPATH ステートメントで指定されたディレクトリにあるか、確認してください。 c:\config.sys の LIBPATH ステートメントで検索できる範囲にあるすべての emx ダイナミックリンクライブラリを表示するには、
emxrev -p c:\config.sysを使います(c: のかわりに、起動ドライブのドライブレターを当てはめます)。 話を簡単にするなら、各 DLL を同一のバージョンにしておくべきでしょう。 古いプログラムは新しい emx の DLL で動作しますが、逆はそうでもありません。
emx.dll を使うプログラムの動作中、emxrt.zip を展開しようとした時にこうなります。 emx.dll を使用するすべてのプログラムを終了し、もう一度やってみてください。 emxrev を実行した場合、コマンドインタプリタが終了するまで emx.dll はロードされたままになります。 したがって、emxrev を実行したすべての OS/2 ウィンドウセッションと OS/2 全画面セッションを閉じるべきでしょう。 emxlibcm.dll その他でもまったく同じことが起こります。
上記不具合を参照。
config.sys の LIBPATH ステートメントを正しく設定しておらず、そのため emx.dll が見つけられないのです。
emx の現行バージョンは DPMI を使えません。
そこでローダは rsx をそのかわりに使おうとしますが、rsx が見つかりませんでした。
対策:rsx をインストールする、もしくは DPMI サーバ(MS Windows)と手を切る。
旧式のプログラム(スタックサイズが小さすぎる場合、emx.dll がスタックオブジェクトを作成すると仮定しているもの)を実行しようとしました。
エラーメッセージの指示通り emxstack を実行し、プログラムのスタックサイズを修正してください。 それができない(ファイルへの書き込み権限がないので)場合は、
set emxopt=-Iと入力し、emx.dll に不具合を無視させます。 しかし、スタックサイズ不足により、プログラムはおそらくクラッシュします。 -I オプションの使用はおすすめいたしません!
ファイルを二重にオープンした場合(おそらく読み込みオープン1回、書き込みオープン1回)、DOS がそんなメッセージを表示するようです。 たとえば、gcc が作業ファイルを使い切ったときに、このようなことが起こります。 cca00002、ccz00002 といった名前(数字は違うかも)のファイルを作業用ディレクトリから探して、消去してください。
emxrev -p c:\config.sysを使う(c: のかわりに、起動ドライブのドライブレターを当てはめる)。 話を簡単にするなら、各 DLL を同一のバージョンにしておくべきである。 古いプログラムは新しい emx の DLL で動作するが、その逆はそうとも限らない。
以下の anonymous ftp で emx が入手可能です。
ftp.leo.org: /pub/comp/os/os2/leo/gnu/emx+gcc/ ftp-os2.cdrom.com: /pub/os2/emx09d/ ftp-os2.nmsu.edu: /pub/os2/dev/emx/v0.9d/
emx の作者は、
Eberhard Mattes Teckstrasse 81 (TeX: Teckstra\ss e) D-71696 Moeglingen (TeX: M\"oglingen) Germany Internet E-Mail: mattes@azu.informatik.uni-stuttgart.de (変わるかも) mattes@windhager.de
どうか電話はかけてこないでください!
ここで言っておかねばなりませんが、返信住所を書いた封筒と返信郵便料金(ドイツ国外なら国際返信切手)を同封していない場合、手紙には返事を出しません。
(訳注:international postal reply coupon に相当するものが日本でどうなっているのかはよく知りません。気になる人は郵便局で調べてみましょう)