7.3. Wineアーキテクチャ
7.3.1. 全体図
Wineの実装は、いくつものサブシステムが実装されていないにせよ、Windows NTアーキテクチャに近いです。(16ビットサポートは、サブシステムではなく、32ビットWindows EXEに実装されていることを思い出してください。) 全体図がここにあります。
+---------------------+ \
| Windows EXE | } アプリケーション
+---------------------+ /
+---------+ +---------+ \
| Windows | | Windows | \ アプリケーション & システムDLL群
| DLL | | DLL | /
+---------+ +---------+ /
+---------+ +---------+ +------------+ +--------+ \
| GDI32 | | USER32 | | | | | \
| DLL | | DLL | | | | Wine | \
+---------+ +---------+ | | |サーバー| \ コアシステムDLL群
+---------------------+ | | | | / (左側)
| Kernel32 DLL | |サブシステム| |NTライク| /
|(Win32 サブシステム) | |Posix, OS/2 | | Kernel | /
+---------------------+ +------------+ | | /
| |
+---------------------------------------+ | |
| NTDLL | | |
+---------------------------------------+ +--------+
+---------------------------------------+ \
| Wine 実行ファイル (wine-?スレッド) | } unix実行ファイル
+---------------------------------------+ /
+---------------------------------------------------+ \
| Wine ドライバ群 | } Wine固有のDLL群
+---------------------------------------------------+ /
+------------+ +------------+ +--------------+ \
| libc | | libX11 | |他のライブラリ| } unix共有ライブラリ群
+------------+ +------------+ +--------------+ / (ユーザー空間)
+---------------------------------------------------+ \
| Unix カーネル (Linux,*BSD,Solaris,OS/X) | } (Unix) カーネル空間
+---------------------------------------------------+ /
+---------------------------------------------------+ \
| Unix デバイスドライバ群 | } Unix ドライバ群 (カーネル空間)
+---------------------------------------------------+ /
Wineは最低限「3大」DLL(KERNEL/KERNEL32とGDI/GDI32とUSER/USER32)を完全に置き換えなければなりません。他の全てのDLLはこの上に積み重なっています。しかしWineは(多くの理由から)NT方式の実装に傾きつつあるので、もう一つNTDLLをコアDLLとしてWineで実装しなければならず、数多くのKERNEL32およびADVAPI32機能をNTDLLを通して実装しなければなりません。
今日現在、(Win32のそれと分かれた)本物のサブシステムはWineに実装されていません。
WineサーバーはコアDLL群の実装のバックボーンを提供します。これは主にプロセス間同期とオブジェクト共有を実装します。これは、実装の観点からみると、NTカーネルとして見ることができます。(例えWineのDLLとWineサーバー間で使われているAPIとプロトコルがWine固有であるとしてもです。)
WineはUnixドライバをPC上の様々なハードウェアにアクセスするのに使用しています。しかしながら、一部のケースでは、Wineは(Windowsの意味の)ドライバーを物理的なハードウェアデバイスに提供しています。このドライバはUnixドライバのプロキシとなります。(例えば、実例として、X11やSDLドライバと一緒にグラフィカル部分、OSSやALSAドライバと一緒にオーディオなど...)
Wineが提供する全てのDLLは、可能な限りWindowsプラットフォームからエクスポートされるAPI群に留まろうとしています。これに当てはまらないのはごくわずかであり、適切にドキュメントされています (WineのDLLはWine固有のAPIをエクスポートしています)。通常、これらは __wine プレフィクスが付いています。
これから、これらの全てのコンポーネントのさらなる詳細を見ていきましょう。
【原文】
7.3. Wine architecture
7.3.1. Global picture
Wine implementation is closer to the Windows NT architecture, even if several subsystems are not implemented yet (remind also that 16bit support is implemented in a 32-bit Windows EXE, not as a subsystem). Here's the overall picture:
+---------------------+ \
| Windows EXE | } application
+---------------------+ /
+---------+ +---------+ \
| Windows | | Windows | \ application & system DLLs
| DLL | | DLL | /
+---------+ +---------+ /
+---------+ +---------+ +-----------+ +--------+ \
| GDI32 | | USER32 | | | | | \
| DLL | | DLL | | | | Wine | \
+---------+ +---------+ | | | Server | \ core system DLLs
+---------------------+ | | | | / (on the left side)
| Kernel32 DLL | | Subsystem | | NT-like| /
| (Win32 subsystem) | |Posix, OS/2| | Kernel | /
+---------------------+ +-----------+ | | /
| |
+---------------------------------------+ | |
| NTDLL | | |
+---------------------------------------+ +--------+
+---------------------------------------+ \
| Wine executable (wine-?thread) | } unix executable
+---------------------------------------+ /
+---------------------------------------------------+ \
| Wine drivers | } Wine specific DLLs
+---------------------------------------------------+ /
+------------+ +------------+ +--------------+ \
| libc | | libX11 | | other libs | } unix shared libraries
+------------+ +------------+ +--------------+ / (user space)
+---------------------------------------------------+ \
| Unix kernel (Linux,*BSD,Solaris,OS/X) | } (Unix) kernel space
+---------------------------------------------------+ /
+---------------------------------------------------+ \
| Unix device drivers | } Unix drivers (kernel space)
+---------------------------------------------------+ /
Wine must at least completely replace the "Big Three" DLLs (KERNEL/KERNEL32, GDI/GDI32, and USER/USER32), which all other DLLs are layered on top of. But since Wine is (for various reasons) leaning towards the NT way of implementing things, the NTDLL is another core DLL to be implemented in Wine, and many KERNEL32 and ADVAPI32 features will be implemented through the NTDLL.
As of today, no real subsystem (apart the Win32 one) has been implemented in Wine.
The Wine server provides the backbone for the implementation of the core DLLs. It mainly implementents inter-process synchronization and object sharing. It can be seen, from a functional point of view, as a NT kernel (even if the APIs and protocols used between Wine's DLL and the Wine server are Wine specific).
Wine uses the Unix drivers to access the various hardware pieces on the box. However, in some cases, Wine will provide a driver (in Windows sense) to a physical hardware device. This driver will be a proxy to the Unix driver (this is the case, for example, for the graphical part with X11 or SDL drivers, audio with OSS or ALSA drivers...).
All DLLs provided by Wine try to stick as much as possible to the exported APIs from the Windows platforms. There are rare cases where this is not the case, and have been propertly documented (Wine DLLs export some Wine specific APIs). Usually, those are prefixed with __wine.
Let's now review in greater details all of those components.