探検


今夜も Wine で乾杯! - 24本目

1login:Penguin
垢版 |
2023/10/30(月) 10:16:30.83ID:ubWIq9ik
Linux上でWindowsのアプリを動作させるソフトウェア
Wineに関する情報交換スレ。

前スレ
今夜も Wine で乾杯! - 23本目
https://mao.5ch.net/test/read.cgi/linux/1585198566/

Wine本家
http://www.winehq.org/
http://wiki.winehq.org/

動作報告Wikiや過去ログなど
http://www.2chlinux.org/index.php?FrontPage

ここにパッチをうpするときはgzipやbzip2で圧縮した上で
base64などでエンコードしてください。おながいします。
動作報告は>>2のテンプレ使用を推奨。
2025/06/13(金) 12:00:53.52ID:doXYGwuX
macOS 28以降はRosetta 2がサポートされなくなるのでWineをMacで動かすのは無理かな
まだ2年以上猶予はあるけど
2025/06/13(金) 19:58:19.74ID:pP1lUoJg
>>396
すでにFEXがARM Windowsでのx86/x86_64エミュレータ xtajit.dllとxtajit64.dllを対応する
Wine用 libwow64fex.dllとlibarm64ecfex.dllを実装済みだから、16Kページサイズ問題を除けば、
Rosetta2がなくなってもなんとかなると思うよ

wiki.fex-emu.com/index.php/Development:ARM64EC#Windows
2025/06/14(土) 12:53:14.36ID:OiYZOC52
>>397
Linuxはどうなってるのか知らないけど、それってMacのCocoaとかフレームワークのコードも変換できるの?
32ビット廃止なった時みたいにCodeWeaverの人たちがなんとかしてくれるのかな
2025/06/14(土) 14:37:00.33ID:2Qahm2TX
>>398
レイヤーが違うからCocoaが64bitでしか動かなくても問題ない

ややこしいんだけど、32bit アプリを64bit OSで動かす仕組みと、64bit x86_64バイナリを64bit ARM CPUで
動かす仕組みは別なので、分けて考えないとダメ

超長文になるんだけど、32bit アプリを64bit OSで動かす仕組みを説明するね

LinuxもmacOSも32bit互換機能はカーネルレベル(システムコールレベル)で対応しており、LinuxでもmacOSでも
既存の32bitバイナリがそのまま動作するようになっている(いた)

一方、Windowsは64bit Itaniumで32bit x86を動かす仕組みとしてWOW64を導入した

Itaniumはx86との互換性が元々低いうえに途中から互換機能が削除されたので、x86バイナリを動かすのには
x86エミュレータが必要な上、システムコールレベルで互換性を保つようカーネルレベルで対応するのは
難しいので、上位のWin32 APIレベルでの互換性を保つようにした

WOW64では32bit アプリからのWin32 API呼び出しに対応する32bit版 kernel32.dll、gdi32.dll、user32.dllを
書き換えて、wow64.dllとwow64win.dll経由で64bit版 kernel32.dll、gdi32.dll、user32.dllを呼び出すようにした
さらにx86エミュレータのIA32Exec.binとWOW64をつなぐwowia32x.dllを利用してItaniumでx86を実行できるようにした

x86_64のWOW64でも基本的な仕組みは同じで、32bit版 kernel32.dllがwow64.dll経由で64bit版 kernel32.dllへの
呼び出し等を行うが、x86_64 CPUにはx86互換モードがあるので、64bitモードと32bitモードを切り替える
wow64cpu.dllを利用して、x86_64でx86を実行している

64bit ARM Windowsでも同じで、32bit版 kernel32.dllを書き換える等は同じで、64bit ARM AArch64 CPUの32bit
AArch32互換機能をwowarmhw.dllを利用してAArch64でAArch32を実行し、32bit x86バイナリはx86エミュレータの
xtajit.dllを利用してAArch64でx86を実行している
2025/06/14(土) 14:42:28.40ID:2Qahm2TX
Wine 9.0以前でx86_64 Linuxで32bit Windowsバイナリを動かす場合やCatalinaより前のmacOSで動かす場合、
32bit版Wineを利用してLinuxやmacOS側の32bit互換機能を使って32bit Windowsバイナリを動かしていた

macOSではCatalina以降OS側の32bit互換機能を削除し、そのままでは32bit版Wineが動かなくなったので、
CodeWeaverはCatalina以降に実装されたLDTを変更するAPIを利用して、自前で64bit版Wineで
32bit Windowsバイナリを動かせるようにした

メモリ空間サイズの違いがあるから1つのプロセス内で32bitと64bitを切り替えるのは困難だけど
CodeWeaverは自前のコンパイラで気合で対応していた(64bitプロセスだけど4GB以下しか使わないよう
スタック等の扱いを変更)

Wine 9.0で導入された新しいWOW64実装を利用する場合、LinuxやmacOSの32bit互換機能ではなく、
WindowsのWOW64と同様の仕組みで32bit Windowsバイナリを動かす

x86_64でx86を動かす場合、LDTを変更するAPI(Linuxではmodify_ldt)を利用してWine側で実装したwow64cpu.dllを
使って、32bitモードと64bitモードの切り替えを行っている

同様に64bit ARM OSでFEXを利用してx86を動かす場合、libwow64fex.dllを利用してx86を64bit AArchで実行する

Win32 APIの実装に関して、Wineで動作するWindowsアプリとWineによるWin32 API実装の実態である
wineserverとの分離がWine 9.0で完了したので、Windowsアプリとwineserverは隔離された別プロセスとなり、
Wine上のWindowsアプリによるWin32 API呼び出しはwineserverへのプロセス間通信で行われる

要するに、Windowsバイナリが32bitか64bitかということがwineserverから切り離されたので、wineserverは
通常の64bit LinuxアプリやmacOSアプリであり、wineserverが利用するCocoaが32bit非対応であっても問題ない

一部のディストリビューションでmultiarch等32bit互換機能を削除しようという話が出ているのもこの関連
もうWineぐらいしかLinuxの32bit互換機能を利用していないのだから、Wineの側で32bit互換機能を提供し
WineがLinuxの32bit互換機能を利用しないのなら、Linuxの32bit互換機能は用無しだということ
2025/06/14(土) 14:46:24.38ID:2Qahm2TX
64bit x86_64バイナリを64bit ARM CPUで動かす仕組みはこの辺参照

- ARM Windowsのx86/x64エミュレーションの日本語での解説(32bit x86エミュレーターのxtajit.dllも含む)
www.ffri.jp/assets/files/research/research_papers/Koh_Nakagawa_Appearances_are_deceiving_Japanese.pdf
- Wine側でのARM64ECの実装
gitlab.winehq.org/wine/wine/-/wikis/ARM64EC-Toolchain
2025/06/14(土) 14:51:47.58ID:2Qahm2TX
この辺ろくな資料がなく自分の独自の考察なので、どこか間違っていたらツッコミお願いしまつ
レスを投稿する


ニューススポーツなんでも実況