EN JA
SVR4(4) (i386)
SVR4(4) FreeBSD Kernel Interfaces Manual (i386) SVR4(4)

名称

svr4System V Release 4 ABI のサポート

書式

この ABI のサポートをカーネルにコンパイルするためには、次の行を利用者のカーネル設定ファイルに置きます:

options COMPAT_SVR4

もう一つの方法として、ブート時にモジュールとして ABI をロードするためには、次の行を loader.conf(5) に置きます:

svr4_load="YES"

解説

svr4 モジュールはユーザランドプリケーションのために制限された System V Release 4 ABI (アプリケーションバイナリインタフェース) 互換性を提供します。モジュールは次の有効な機能を提供します:
  • 正しい印の elf(5) 実行形式イメージのためのイメージ駆動機能
  • 駆動されたイメージのための特別のシグナル処理
  • SVR4 からネイティブのシステムコールへの変換
  • ( streams(4) ロード可能モジュールまたはカーネル設定ファイルの
    device streams
    を用いることによって) STREAMS ネットワーク API エミュレーション
  • FreeBSD と SVR4 ioctl(2) 呼び出しの間のマッピング、またはそのようなマッピングが存在しないところで、 SVR4 呼び出しのリバースエンジニアされた実装。

エミュレータを通して提供されなかった SVR4 ABI サポートに注意することは重要です。むしろ、真の (制限されますが) "クリーンルーム"リバースエンジニアされた ABI 実装を提供します。

制限

提供された ABI は実際の SVR4 ソースコードを知らない状態で開発されたので、アプリケーションを誤動作させる SVR4 クライアントアプリケーションとエミュレートされた ABI の間の予期しない相互作用となる限界があります。

さらに、いくつかの SVR4 オペレーティングシステムは SVR4 ELF 規格を順守していません。特に、Solaris は ELF ヘッダ中の ELF インタプリタフィールドを SVR4 アプリケーションとしてクライアントの実行形式をカーネルが正しく識別するための値に設定していません。したがって、あるインスタンスでは、明白に実行形式に印を付ける brandelf(1) ユーティリティを使用するか、または kern.fallback_elf_brand sysctl(8) 変数に印なしの実行形式のために "デフォルト" ABI を定義するように設定する必要があります。値の ELFOSABI_SOLARIS は Solaris を表します。 ELFOSABI_SYSV は他の SysVR4 オペレーティングシステムを表します。 ELFOSABI 印つけの定義について < sys/elf_common.h> を、印がついた実行形式の情報については brandelf(1) を参照してください。

svr4 モジュールは COMPAT_SVR4 カーネル設定オプションで静的にカーネルにリンクするか、または必要に応じてロードすることができます。次のコマンドは、カーネルにリンクされていないか、またはモジュールとしてまだロードされていないなら、モジュールをロードします:

if ! kldstat -v | grep -E 'svr4elf' > /dev/null; then 
 kldload svr4 > /dev/null 2>&1 
fi

カーネルは、 streams(4) モジュールの存在をチェックして、必要なら、それをロードします。

ダイナミックにリンクされた SVR4 実行形式が /compat/svr4 で適切な環境を必要とすることに注意してください。

システム起動時に自動的に svr4 カーネルロード可能なモジュールをロードする情報に関しては、 rc.conf(5) を参照してください。この情報は svr4 モジュールが静的にカーネルにリンクされるか、またはモジュールとしてロードされるかどうかにかかわらず適用されます。

STREAMS エミュレーションは制限されていますが、(大部分は) 機能的です。 streams(4) モジュールがロードされていると仮定すれば、STREAMS ハンドルは /dev/compat/svr4/dev の関連ファイルのオープンされた 1 つによって獲得することができます。内部的に、 streams(4) ドライバは、ソケット記述子を生成し、それをクライアントアプリケーションに返す前に追加の STREAMS 状態情報で“タグ付け”します。 svr4 環境は、STREAMS 特有の ioctl(2) 呼び出しが実行されるとき、エミュレートされた STREAMS ハンドルを認識して操作するために追加の状態情報を使用します。

提供された STREAMS の機能性の部分集合は小さく、たぶん、 Solaris CD を走らせるときに有効なプログラムを必要とするものと大差ありません。

関連ファイル

/compat/svr4
最小の SVR4 実行時環境
/sys/compat/svr4/syscalls.master
SVR4 システムコールと svr4 モジュールのエントリポイントの間のマッピング。

関連項目

brandelf(1), streams(4), elf(5)

歴史

System V Release 4 ABI のサポートは FreeBSD 4.0 ではじめて登場しました。この ABI は Christos Zoulas によって書かれた NetBSD 1.3 の現在の同等な機能から移植されました。

バグ

シグナルハンドラのエミュレーションはバグが多いです。

エミュレートされたコネクションレス STREAMS はいくつかの事情でネットワークからデータの受信に失敗します (しかし、たぶん streams(4) モジュールが誤った処理しているそれらを初期化する特定の方法のため、および STREAMS と poll(2) (ポーリング) の間の相互作用のために -- 他のものは成功します)。接続指向の STREAMS は、機能的であるように見えます。

皮肉なことに、この SVR4 エミュレータは (まだ) SVR4 セマフォや共有メモリをサポートしていません。

自動的に /compat/svr4 環境を作成する ports(7) は存在していません。前もって装備されたツリーを含んでる tar(1) アーカイブは http://people.FreeBSD.org/~newton/freebsd-svr4/ から取得できます。

広範囲のテストは、初期のリビジョンの SCO メディアでテスタから来る限られた成功の事例報告と共に、本当に Solaris2.x バイナリで実行されるだけです。理論的には、基本的な SVR4 ABI は SVR4 オペレーティングシステムを製造するベンダのセットにわたって一定であるべきですが、実際にはたぶんそのような場合はありません。必要なら、今後の仕事は、この ABI 実装で実装された振る舞いから脱却した OS 依存を含む機能を生成する追加 kld(4) モジュールを実装することです。代わりに、 sysctl(8) 変数はクライアントアプリケーションに提出するべきである“パーソナリティ”環境を設定することができます。

March 17, 2008 FreeBSD