Skip to main content.
Google custom search

NetBSD バイナリーエミュレーション

バイナリーエミュレーション


バイナリーエミュレーション

バイナリーエミュレーションとは何ですか? なぜ存在するのですか? (トップ)

多くの Unix ソフトウェアはソースコード形式で配布されます。これは、作者 が C (あるいは他の言語)のプログラムコードを提供し、インストール時に、 ローカルマシンで実行するための実行可能ファイルを生成するためにコンパイ ラーを使うことを意味します。ソースコードとインストレーションユーティリ ティーを注意深く書けば、さまざまな種類のオペレーティングシステム上で、同 一のプログラムを構築することができます。

ソースコードは企業秘密を含んでいることがあるため、商用ソフトウェア ベンダーはソースコードの配布をおこなわない傾向があります。商用ベンダー は、通常、直接実行可能なプログラムを配布します。ベンダー内部でコンパイ ルをおこない、機密が簡単に洩れないバイナリーファイルを配布します。

この結果、ベンダーはサポートするオペレーティングシステムのためにマ ンパワーを費やさざるをえません。通常、保守のためのテストをおこない、そ して、コンパイルとテストのためにすくなくとも一人の人間が必要です。

このことは、オペレーティングシステムと消費者が使いたいと思っている アプリケーションを結びつけます。ある消費者は、彼らが使っているオペレー ティングシステムがサポートされていないので、アプリケーションを使うのを あきらめるかもしれません。また、ある消費者は、いくつかの絶対に必要なア プリケーションのために、サポート済みのオペレーティングシステムを使わな ければならないかもしれません。

バイナリーエミュレーションは、この強制的な結び付きを取り除きます。

他にどのようなバイナリー互換性がありますか? (トップ)

知っておく価値のあるもうひとつの互換性の仕様があります。NetBSD は同じ CPU を使用する NetBSD マシン間で、同一のバイナリーオブジェクトファイル フォーマットを使用します。もし、NetBSD sun3 上でバイナリーを作成した場 合、そのバイナリーを NetBSD amiga、NetBSD mac68k、NetBSD mvme68k、 NetBSD next68k 等の上で実行することができます。しかしながら、そのバイ ナリーを Intel プロセッサー系のマシン上で実行することはできません。

どのように動作するのですか? (トップ)

Unix と Unix 風のシステムは、二つの重要な部分、カーネルとそれ以外で構 成されています。カーネルは、デバイスやセキュリティー、マシンのリソースを 使うプログラムを管理します。通常、カーネルはカーネルシステムコールを 経由し、他のプログラムへサービスを提供します。例えば、ファイルをOPEN するプログラムの場合、プログラムはカーネルの OPEN 関数をコールします。 カーネルはその要求を許可あるいは拒否し、プログラムが処理を継続するのに 必要な情報をかえします。

すべての Unix と Unix 風のシステムは、よく似たシステムコールの集合 を提供しています。(例えば、OPEN はすべてのシステムに存在します。)

システム間でのシステムコールの一番の違いはシステムコールにわたされ るパラメーターのフォーマットでしょう。(NetBSD の OPEN は、ファイル名、 フラグ、モードをわたします) システム間で、システムコールの名前 が異なる場合もあります。NetBSD システム上で Linux の実行可能ファイルを 実行する場合、プログラムがシステムコールを実行する度に、カーネルは適切 な NetBSD のシステムコールへのマッピングや、必要なパラメーターの並べ変え、 再フォーマットをおこないます。

もう一つの重要な問題は、実行可能ファイルのフォーマットが異なる事で す。すべての他のオペレーティングシステムは、バイナリーを保存するのに異 なるヘッダー、マジッククッキー、hunks、その他を使った異なるファイルフォー マットを使用しています。NetBSD が、ネイテイブにサポートしているのは a.out か ELF (アーキテクチャーとバージョンに依存します。NetBSD は、ポー ト毎のスケジュールに従って ELF に移行中です)です。他に、b.out、COFF、 ECOFF、ieee695、PE、SOM、XCOFF という実行可能フォーマットをサポートし ています。NetBSD のエミュレーションは、これらの実行可能フォーマットを エミュレーションされるシステム上でどのように扱えば良いかを知っています。

異なるシステムでは、システムコールは異なった方法でアクセスされます し、パラメーターも異なる方法でわたされます。例えば、AmigaOS では、他の アドレスレジスターやデータレジスター内のデータによって指されている関数へ のポインターを含むテーブルのインデックスが使用されます。他のオペレーティ ングシステムは他の方法、トラップ、テーブル、レジスター、スタック等を使 用しています。そして、これはバイナリーエミュレーションによって処理されます。

最後になりますが、実行可能ファイルがコンパイルされた CPU と、実行す るシステムの CPU が一致していることは非常に重要です。システムコールと 比較すると、実行可能ファイルは 低レベルの CPU インストラクションで構成 されています。したがって、SCO Unix バイナリー(Intel 386 シリーズ CPU) は、NetBSD i386 上で動作します。しかし、NetBSD Amiga (Motorola 680x0 CPU) 上で動作させる事はできません。これをおこなうためには、もっと複雑な変換 システムが必要です。そして、これはアプリケーションの性能に大きな影響を あたえます。

どのシステムのバイナリーを動かす事ができますか? (トップ)

一般的には、NetBSD と同じハードウェア上で動作する unix オペレーティン グシステム用のバイナリーを動かすことができます。それぞれのポートでサポー トされているバイナリーのフォーマットのリストと、成功例が、 このページの一番最後から選択できるプラットフォーム 固有のページにあります。

性能はどうでしょうか? (トップ)

余計なオーバーヘッドは、エミュレートされるシステムコールから NetBSD の ネイテイブなシステムコールへのマッピングと、必要ならパラメーターの再フォー マットにかかる時間だけです。したがって、非常に、非常に高性能です。大雑 把な見積もりでは、最大で 1-2% の性能への大きな影響があります。もし、あ なたが 2% を大きな影響と考えるならですが。これは、プログラムが使用して いるシステムコールに依存して変化します。ほとんどのマッピングは、実際に システムコールが実行される時間の 1% 未満でしょう。

他に注意すべき事がありますか? (トップ)

同じタイプの CPU、システムコールのマッピング以外にも考慮しなければな らない事があります。多くの Unix システムは共有ライブラリーをサポートし ています。これは、コンパイル済みのプログラムには、すべての関数が含まれ ていないという事を意味しています。(これはプログラムのサイズを小さくで きるという事でもあります)。しかし、このせいで、外部のライブラリーは、 プログラムがコンパイルされた時に使っていたものと一致していなければなり ません(こまかな変更は関係ありません)。バイナリーエミュレーションでプロ グラムを実行したい場合、「file」コマンドを使用し、スタティックリンクか ダイナミックリンクかを調べる事ができます。

% file qwsv
qwsv: BSD/OS i386 compact demand paged executable
% file arp
arp: NetBSD/i386 demand paged dynamically linked executable

「dynamically linked」と表示された場合、スタティックにリンクされて いないという事を意味しています。フリーに配布されている Unix システム 用の共有オブジェクトのライブラリーは、NetBSD pkgsrc を使い /compat ディレクトリーにインストールされます。スタティックにリンクされたバイナリー を実行する場合には、共有ライブラリーは必要ありません。

商用のシステムの場合は、自分自身でライブラリーを用意する必要があり ます。一覧を得るためには man -k compat を参照してください。イン ストールの手順については、 man compat_os (os の部分はターゲット OS) を参照してください:

% man -k compat
compat_freebsd(8) - setup procedure for running FreeBSD binaries
compat_ibcs2(8) - setup procedure for running binaries that conform to the Intel Binary Compatibility Standard 2, e.g. SCO Unix and others derived from AT&T SVR3.
compat_linux(8) - setup procedure for running Linux binaries
compat_osf1(8) - setup procedure for running OSF/1 (AKA Digital Unix, AKA Tru64) binaries
compat_pecoff(8) - setup procedure for running Win32 binaries
compat_sunos(8) - setup procedure for m68k and sparc architectures
compat_svr4(8) - setup procedure for running SVR4/iBCS2 binaries
compat_ultrix(8) - setup procedure for Ultrix compatibility on mips and vax

私のマシンでは、どの OS のエミュレーションが可能ですか? (トップ)

NetBSD は、さまざまな CPU とハードウェア上で動作します。機種固有の 情報については、以下のリストを参照してください。もし、これ以外の エミュレーションについての情報を知っていたら、どうか 私達に教えてください

alpha
  • Linux(Alpha)
  • OSF/1
amiga
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
arc
arm26
arm32
atari
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
bebox
cobalt
dreamcast
hp300
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
hpcmips
hpcsh
i386
  • BSDI (BSDI 3.x バイナリーまで)
  • FreeBSD(x86) (a.out と ELF バイナリー)
  • IBCS2 システム
    • Interactive Unix
    • SCO Unix
    • SCO Xenix
  • Linux(x86)
  • Solaris(x86)
luna68k
mac68k
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
macppc
mipsco
mvme68k
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
news68k
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
newsmips
next68k
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
ofppc
pmax
prep
sandpoint
sgimips
  • IRIX(mips)
  • Linux(mips)
  • Ultrix(mips)
sh3
sparc
  • SunOS(sparc)
  • Solaris(sparc)
sparc64
  • 32 ビット NetBSD/sparc (ELF と a.out いずれも)
  • SunOS(sparc)
  • Solaris(sparc) (32 ビットと 64 ビットいずれも)
sun3
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)
vax
x68k
  • Amiga Unix (SVR4)
  • Linux(m68k)
  • SunOS(68k)

どのようなアプリケーションが動作するのでしょうか? (トップ)

NetBSD は、さまざまな CPU とハードウェア上で動作します。機種固有の情報 については、以下のリストを参照してください。もし、これ以外のアプリケー ションについての情報を知っていたら、どうか 私達に教えてください

alpha
  • Acroread - Digital Unix
amiga
arc
arm26
arm32
atari
bebox
cobalt
dreamcast
hp300
  • Gnat (Gnu Ada Translator) - SunOS
hpcmips
hpcsh
i386
  • Acroread - Linux(x86)
  • 翻訳の王様 POWER+ - Linux(x86)
  • Mathematica 5.2 - Linux(x86)

    Mathematica のインストール時には、以下のパッチを適用する必要があります:

    --- Unix/Installer/MathInstaller.orig	2005-07-18 14:23:57.000000000 -0400
    +++ Unix/Installer/MathInstaller	2005-07-18 14:26:36.000000000 -0400
    @@ -1,4 +1,4 @@
    -#!/bin/sh
    +-o #!/bin/sh
     # ----------------------------------------------------------------------------
     #
     #   Installer for Mathematica Applications
    @@ -11,6 +11,8 @@
     LANG=C
     export LANG
     
    +UNAME=`uname -s`
    +
     # ----------------------------------------------------------------------------
     # Function: CleanUp_()
     
    @@ -806,7 +808,7 @@
              DefaultSystemID="HPUX-PA64";;
           IRIX64)
              DefaultSystemID="IRIX-MIPS64";;
    -      Linux)
    +      Linux|NetBSD)
              case `uname -m` in
                 alpha)
                    DefaultSystemID="Linux-AXP";;
    @@ -1229,7 +1231,8 @@
              -o "${DefaultSystemID}" = "DEC-AXP" \
              -o "${DefaultSystemID}" = "HPUX-PA64" \
              -o "${DefaultSystemID}" = "IRIX-MIPS64" \
    -         -o "${DefaultSystemID}" = "MacOSX" ]; then
    +         -o "${DefaultSystemID}" = "MacOSX" \
    +	 -o "${UNAME}" = "NetBSD" ]; then
              Spacing_=`expr ${TermWidth} - 3`
              WhiteSpace_=`printf "%-${Spacing_}s"`
              DotText_="[${WhiteSpace_}]"
    @@ -1993,14 +1996,14 @@
     
        case "${CopyTextType_}" in
        "Error")
    -      if [ "${DefaultSystemID}" = "MacOSX" ]; then
    +      if [ "${DefaultSystemID}" = "MacOSX" -o "${UNAME}" = "NetBSD" ]; then
              echo "${CopyText_}" | fmt ${TWmin} ${TermWidth}
           else
              echo "${CopyText_}" | fmt -${TermWidth}
           fi
           echo "";;
        "Prompt")
    -      if [ "${DefaultSystemID}" = "MacOSX" ]; then
    +      if [ "${DefaultSystemID}" = "MacOSX" -o "${UNAME}" = "NetBSD" ]; then
              echo "${CopyText_}" | fmt ${TWmin} ${TermWidth}
           else
              echo "${CopyText_}" | fmt -${TermWidth}
    @@ -2008,7 +2011,7 @@
           echo ${n} "> ${c}";;
        "Text")
           if [ "${CopyText_}" != "" ]; then
    -         if [ "${DefaultSystemID}" = "MacOSX" ]; then
    +        if [ "${DefaultSystemID}" = "MacOSX" -o "${UNAME}" = "NetBSD" ]; then
                 echo "${CopyText_}" | fmt ${TWmin} ${TermWidth}
              else
                 echo "${CopyText_}" | fmt -${TermWidth}
    @@ -2022,7 +2025,7 @@
           WhiteSpace_=`printf "%-${Spacing_}s"`
           echo "${WhiteSpace_}${CopyText_}";;
        "Verbose")
    -      if [ "${DefaultSystemID}" = "MacOSX" ]; then
    +      if [ "${DefaultSystemID}" = "MacOSX" -o "${UNAME}" = "NetBSD" ]; then
              echo "<< ${CopyText_} >>" | fmt ${TWmin} ${TermWidth}
           else
              echo "<< ${CopyText_} >>" | fmt -${TermWidth}

    The shell scripts that start the application after the installation need the following patch:

    --- MathKernel.orig	2005-07-18 14:36:44.000000000 -0400
    +++ MathKernel	2005-07-18 14:35:37.000000000 -0400
    @@ -16,7 +16,7 @@
     			SystemIDList="HPUX-PA64";;
     		IRIX64)
     			SystemIDList="IRIX-MIPS64";;
    -		Linux)
    +		Linux|NetBSD)
     			case `uname -m` in
     				ia64)
     					SystemIDList="Linux-IA64";;
    --- Mathematica.orig	2005-07-18 14:36:47.000000000 -0400
    +++ Mathematica	2005-07-18 14:35:47.000000000 -0400
    @@ -19,7 +19,7 @@
     			SystemIDList="HPUX-PA64 HP-RISC";;
     		IRIX64)
     			SystemIDList="IRIX-MIPS64";;
    -		Linux)
    +		Linux|NetBSD)
     			case `uname -m` in
     				alpha)
     					SystemIDList="Linux-AXP";;
    --- math.orig	2005-07-18 14:35:18.000000000 -0400
    +++ math	2005-07-18 14:36:03.000000000 -0400
    @@ -16,7 +16,7 @@
     			SystemIDList="HPUX-PA64";;
     		IRIX64)
     			SystemIDList="IRIX-MIPS64";;
    -		Linux)
    +		Linux|NetBSD)
     			case `uname -m` in
     				ia64)
     					SystemIDList="Linux-IA64";;
    --- mathematica.orig	2005-07-18 14:36:52.000000000 -0400
    +++ mathematica	2005-07-18 14:36:13.000000000 -0400
    @@ -19,7 +19,7 @@
     			SystemIDList="HPUX-PA64 HP-RISC";;
     		IRIX64)
     			SystemIDList="IRIX-MIPS64";;
    -		Linux)
    +		Linux|NetBSD)
     			case `uname -m` in
     				alpha)
     					SystemIDList="Linux-AXP";;
    --- mcc.orig	2005-07-18 14:36:36.000000000 -0400
    +++ mcc	2005-07-18 14:36:31.000000000 -0400
    @@ -15,7 +15,7 @@
     		SystemIDList="HPUX-PA64";;
     	IRIX64)
     		SystemIDList="IRIX-MIPS64";;
    -	Linux)
    +	Linux|NetBSD)
     		case `uname -m` in
     			ia64)
     				SystemIDList="Linux-IA64";;

  • Matlab - Linux(x86)

    さらなる情報は http://www.spg.tu-darmstadt.de/~hf/notes/matlab-on-netbsd.html および http://mail-index.NetBSD.org/port-i386/2005/10/07/0002.html にあります。

  • Maple 6.1, 7, 8, 9.5 および 10 - RedHat Linux(x86)

    Maple には SuSE 用と RedHat Linux 用のバイナリーが附属しますが、 たとえ SuSE 互換パッケージを使ったとしても、 RedHat 用しか 動作しません。いずれにせよ、たいした問題ではありません。 NetBSD の情報をシステムに与えるため、小さなパッチが必要です:

    --- maple.system.type.orig      Mon Apr 30 17:26:11 2001
    +++ maple.system.type   Mon Apr 30 17:40:49 2001
    @@ -84,6 +84,11 @@
                    MAPLE_BIN="bin.IBM_INTEL_LINUX"
            fi
             ;;
    +    "NetBSD")
    +       # NetBSD uses SuSE compat per default, but maple works
    +       # (only) with the RedHat compat. 
    +       MAPLE_BIN="bin.IBM_INTEL_LINUX"
    +       ;;
         *)
             # currently do not support any other platforms
             MAPLE_BIN="FAIL"

    このパッチを mapledir/bin/maple.system.type に適用すれば、 maple、 xmaple その他が使えるようになります。

    新しいディレクトリーを作るようインストーラーに指示した場合、 そのディレクトリーはエミュレートされたルートの下に作られることをお忘れなく (たとえば、 /usr/local/maple 以下にインストールするよう指示した場合、 実際には /usr/pkg/emul/linux/usr/local/maple が作られます)。

  • Mozilla - FreeBSD(x86)
  • Mozilla - Linux(x86)
  • Netscape - BSDI(x86)
  • Netscape - Linux(x86)
  • Netscape - Solaris(x86)
  • Neverwinternights dedicated server - Linux(x86)
  • Perforce - FreeBSD(x86)
  • Planmaker - Linux(x86)
  • Realplayer 5, 7 - Linux(x86)
  • sqlplus Oracle クライアント - Solaris(x86)
  • StarOffice 5.1a - Linux(x86) (NetBSD 1.5 以降が必要)
  • Textmaker - Linux(x86)
  • Quake 1, 2, 3 - Linux(x86)
  • VMWare ESX/GSX Server - Linux(x86)
  • WordPerfect 8, 8.1 - Linux(x86)
  • Oracle Oracle 9.2.0.4 - Linux(x86) - http://n0se.shacknet.nu/ の 'database' 参照
luna68k
mac68k
macppc
mipsco
mvme68k
news68k
newsmips
next68k
ofppc
pmax
prep
sandpoint
sgimips
sh3
sparc
  • Acroread3 - SunOS(sparc)
  • Netscape - Solaris(sparc)
  • Networker - SunOS(sparc)
  • 「ほとんど」の SunOS(sparc) ユーザーランド。カーネル配下のものは普通は動作しません。
sparc64
  • 「ほとんど」の SunOS(sparc) ユーザーランド。カーネル配下のものは普通は動作しません。
sun3
vax
  • iBCS2 (そうです!) によって、DEC SVR3 附属のユーザーランド。
x68k

どのようなアプリケーションが動作しないのでしょうか? (トップ)

NetBSD は、さまざまな CPU とハードウェア上で動作します。機種固有の情報 については、以下のリストを参照してください。もし、これ以外のアプリケー ションについての情報を知っていたら、どうか 私達に教えてください

いくつかのケースでは、アプリケーションは、初期の NetBSD のリリースでサ ポートされていないエミュレーションレイヤーの機能を必要とします。通常こ れは、他の OS が新しいシステムコールを実装し、アプリケーションの作者が それを使うようにアプリケーションを変更した時におこります。以下のリスト で、「サポートされていないもっとも新しいバージョン」と書かれているアプ リケーションは、それ以降の NetBSD のリリースで動作します。

alpha
amiga
arc
arm26
arm32
atari
bebox
cobalt
dreamcast
hp300
hpcmips
hpcsh
i386
  • eWnn(日本語/英語 翻訳) - Linux(x86) (Mule 2.3 が必要、SEGV)
  • 翻訳魂 (日本語/英語 翻訳) - Linux(x86)
  • 一太郎 ARK for Java (日本語ワードプロセッサー) - Linux(x86) (JSDK1.2.2 が必要)
  • Objectivity - Linux(x86) (データベース作成時に coredump)
  • Oracle - Linux(x86) (インストール時に SEGV)
  • Shade Preview - Linux(x86) (たぶん RedHat の共有ライブラリーが必要)
  • StarOffice 5.1a - Linux(x86) (NetBSD 1.4.x では未対応)
  • Wnn6 Ver3 - Linux(x86) (必要な symlink がオープンできない)
luna68k
mac68k
macppc
mipsco
mvme68k
news68k
newsmips
next68k
ofppc
pmax
prep
sandpoint
sgimips
sh3
sparc
  • Acroread4 - Solaris(sparc)
sparc64
sun3
vax
x68k

Back to NetBSD ドキュメンテーション