web-dev-qa-db-ja.com

Wineはエミュレータではないのですか?

エミュレーターを(簡単な方法で)理解すると、システムXの関数を使用するプログラムの関数呼び出しを、プログラムが実行されているシステムYが使用する関数に変換または置換します。 Wine プロジェクトは、Wineはエミュレータではないと主張しています。

Wineは仮想マシンやエミュレーターのような内部のWindowsロジックをシミュレートする代わりに、Windows API呼び出しをその場でPOSIX呼び出しに変換し、他のメソッドのパフォーマンスとメモリのペナルティを排除し、Windowsアプリケーションをデスクトップにきれいに統合できるようにします。

ええと、エミュレーターと仮想マシンは、Windows以外のホストシステム上のWindowsの内部ロジックをどのようにシミュレートしますか? Windowsシステムコールをホスト自身のそれぞれのコールに変換することではありませんか?エミュレーターと(Wineのような)非エミュレーターの違いは、エミュレーターはオペレーティングシステム全体をエミュレートすることであり、アプリケーションはエミュレーターと通信していることを認識せずにアプリケーションがそのシステムAPIを使用しますが、非エミュレーターはアプリケーションの呼び出しをホストの(そして、アプリケーションもそれを知らないかもしれません)?間接参照の追加レベルは、エミュレーターとWineの唯一の違いですか?

26
amyassin

ええと、エミュレーターと仮想マシンは、Windows以外のホストシステムの内部Windowsロジックをどのようにシミュレートしますか? Windowsシステムコールをホスト自身のそれぞれのコールに変換することではないですか?

いいえ、または少なくともWINEが行う意味では、ユーザースペースで文字どおりシステムコールを1対1に変換します。エミュレータは、より遠回りの経路を介してこれを抽象的に実行します。システムコールは直接変換されません。

Trueemulatorは仮想machineを作成します(例x86-64) 、仮想オペレーティングシステムではありません。その後、理論的には、そのスタイルのマシンをターゲットとする任意のオペレーティングシステムを実行できます。通常、「エミュレータ」にはオペレーティングシステムが含まれますが、それが実際にエミュレートするものではありません。含まれているOSは、実際のマシンで実行されるものと同じです。

エミュレータは、ホストマシンとは異なるハードウェアのシミュレーションに使用される場合がありますが、あるOSを別のOSの内部で実行するためにまったく同じハードウェアをシミュレートする場合にも使用されます。

WINEはこれとは異なり、実際にはウィンドウではありません。 x86-64エミュレーターを、ウィンドウの実際のコピーを使用して実行できますが、それはWINEとは異なります。実際にはエミュレータよりも効率的であるという彼らの主張は、システムコールを変換するだけのオーバーヘッドが、VMを実行するオーバーヘッドよりもおそらく低いということです。欠点は、WINEはウィンドウにしかできないことです。 通常のVM のように、他のOSでは使用できません。

30
goldilocks

Java仮想マシンを検討してください。JVMは他のものをエミュレートしません。それらはすべて仕様の実装です。Wineはwin32 APIをエミュレートしていません。それはその実装です。仕様と現実は必ずしも一致しません、Microsoftの実装とWineの実装の両方にバグのあるコードを機能させるための回避策があり、どの実装がどのプロジェクトにとってより適切なターゲットであるかは必ずしも明らかではありません。

14
jthill

Wineは、Windows API呼び出しをインターセプトし、その場で対応するLinux API呼び出しに変換するシムです。代わりに、エミュレーターまたは仮想マシンが物理マシンをエミュレートします。明らかに、shimの方が効率的ですが、目的の機能を完全に模倣できるわけではありません。

4
Fred Thomsen

エミュレータは、それ自体が別のOS /プロセッサプラットフォーム上で実行されるエミュレータアプリケーションでOS /プロセッサプラットフォームのロジックと動作を作成することにより、通常Windowsアプリケーションを実行するプロセッサまたはOSを仮想化します。 WineはWindows OS /プロセッサの動作を仮想化せず、WindowsアプリケーションをWindows OSと同じ抽象化レベルで実行します。これは、Windows APIを再実装して、UnixベースのOS /プロセッサプラットフォームで直接実行することで実現します。つまり、WineはWindows OSのコア要素の再実装であり、Windows API呼び出し要求を、物理プロセッサと直接通信する同等のUnixベースのコードに直接変換するコンパイル済みDLLのセットです。

これは、Wine + LinuxがWindows自体よりも高速にWindowsアプリケーションを実行できるランタイムコンテキストがあることを意味します。より高い抽象度でUnixベースのプラットフォーム上でCPU/WinOSプラットフォームをシミュレートするためにコードがビジーになるため、エミュレーターがその可能性を持つことは決してありません。この場合、Windowsアプリケーションを実行するには、さらに多くの変換とインターフェースが必要です。 (下図を参照)

つまり、WineはWindowsの再実装であり、Windowsのエミュレーションではありません。

enter image description here

0