今夜も Wine で乾杯! - 24本目 (435レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
399: login:Penguin [sage] 2025/06/14(土) 14:37:00.33 ID:2Qahm2TX(1/4) AAS
>>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を実行している
400: login:Penguin [sage] 2025/06/14(土) 14:42:28.40 ID:2Qahm2TX(2/4) AAS
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互換機能は用無しだということ
401: login:Penguin [sage] 2025/06/14(土) 14:46:24.38 ID:2Qahm2TX(3/4) AAS
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
402: login:Penguin [sage] 2025/06/14(土) 14:51:47.58 ID:2Qahm2TX(4/4) AAS
この辺ろくな資料がなく自分の独自の考察なので、どこか間違っていたらツッコミお願いしまつ
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.021s