[過去ログ] 今夜も Wine で乾杯! - 23本目 (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
678
(2): login:Penguin [sage] 2022/04/19(火) 10:24:43.26 ID:WRR9mRIv(1/2)調 AAS
>>676
676(1): login:Penguin [sage] 2022/04/19(火) 00:09:25.36 ID:6BsM3YVq(1/2)調 AAS
>>673
16ビットと言っても
?DOS用で、リアルモードまたは仮想8086モード向けのコード
?Win3.x用で、16ビットプロテクトモードまたは16ビット互換モード向けのコード
の2種類あって、

i)32bitWindowsの場合、?は仮想8086モードに移行して直接動作(ntvdm)、?は16ビットプロテクトモードに移行して直接動作(wowexec)

ii)32bitlinux上のwineの場合、?は仮想8086モードに移行して直接動作(vm86システムコール利用)、?は16ビットプロテクトモードに移行して直接動作(modify_ldtシステムコール利用)

iii)64bitlinux上のwineの場合、?はDOSBoxのエミュレーション(longモードでは仮想8086モード非対応のため)、?は16ビット互換モードに移行して直接動作(32bitwineからmodify_ldtシステムコール利用)

iv)64bitWindowsの場合、?は非対応(longモードでは仮想8086モード非対応のため)、?も非対応(MSのやる気がないため)

v)64bitWindows上のwinevdmでは、??いずれもエミュレーションまたはCPUの仮想化機能を使う
> ii)32bitlinux上のwineの場合、?は仮想8086モードに移行して直接動作(vm86システムコール利用)
Wine4.0でvm86システムコールを利用するコードが削除され、以降はdosboxのCPUエミュレーションで
リアルモードのコードを実行するようになっているはず

dosboxを利用するコードが入ったのはWine1.4

Wineのコードをgrep vm86して確認してみて

> ?は16ビットプロテクトモードに移行して直接動作(modify_ldtシステムコール利用)

自分もこう動いているように思っていたんだけど実際のwineでmodify_ldtを使っている箇所は
https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/ntdll/signal_i386.c
https://source.winehq.org/git/wine.git/blob/HEAD:/libs/wine/ldt.c
の2つで、下はobsoleteになっていて使っていないっぽい

コード読み切れていないから全然理解できていないだけど、本当にWineは16bitプロテクトモードの
コードの実行にmodify_ldtを利用している?

winevdmのコードを見てもdosboxを呼びだしているのはわかるんだけど、どこまでdosboxのCPU
エミュレータでコードを動かしているかわからん


続1
680: login:Penguin [sage] 2022/04/20(水) 00:54:34.60 ID:s2MtO61K(1/2)調 AAS
>>678
今は32bit環境がないからdosプログラムがどうなっているかはすぐには確認できないけど、Win3.x向けプログラムはWine7.6でもmodify_ldtを使っている(少なくとも俺環では)
strace -f wine <win16app.exe> |& grep modify_ldt
で一杯出る
あと、64bitのlinux環境では32bit用セグメントが常にGDTに用意されていたと思うから、32bit互換モードにはfar jmp一発で移れる(アセンブリで試しに書いたら動いた)
681
(1): login:Penguin [sage] 2022/04/20(水) 03:25:51.41 ID:s2MtO61K(2/2)調 AAS
>>678
https://source.winehq.org/git/wine.git/blob/HEAD:/include/wine/asm.h
を見る限り、MacとAndroidの場合に16bit用のLDT関連がobsoleteになるっぽい
確かにMacは今や32bit互換モードも含めてobsoleteだし、Androidはセキュリティのためseccompで多くの不要なシステムコールを禁止している

あと、https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/wow64cpu/cpu.c
の144行とかにfar jmpがあるから、ここでモード移行かな
これはWindowsのHeaven's Gateと同じ方式
不要になるのは32bitのlinuxのライブラリ(/usr/libとか/usr/lib32にある.so)であって、Wineの32bitライブラリ(syswow64にあるやつ)は必要
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.044s