アカウント名:
パスワード:
x64版Windowsで64bitコード←→32bitコード間の呼び出しができない(thunkがない)のは、Itanium版Windowsの仕様に合わせたから。そのせいで64bitコードと32bitコードをシームレスに実行できるAMD64のメリットがWindowsにおいては全く生かされていない。
言わばItaniumの負の遺産。後方互換性にこだわるMicrosoftのことだから、128bit版Windowsが出るまでこの仕様に悩まされそうorz
なんで誰でも分かってる様な調べりゃすぐ出てくる既出なことを説明せにゃならんのだねそれをすることで我々にどんなメリットがありますか?
#しかも、あなたは多分説明しても分からないレベルでしょうに
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
にわかな奴ほど語りたがる -- あるハッカー
64bit版Windowsのタコな仕様はItaniumのせい (スコア:2, 興味深い)
x64版Windowsで64bitコード←→32bitコード間の呼び出しができない(thunkがない)のは、Itanium版Windowsの仕様に合わせたから。
そのせいで64bitコードと32bitコードをシームレスに実行できるAMD64のメリットがWindowsにおいては全く生かされていない。
言わばItaniumの負の遺産。
後方互換性にこだわるMicrosoftのことだから、128bit版Windowsが出るまでこの仕様に悩まされそうorz
Re: (スコア:1, すばらしい洞察)
もう少し具体的に説明してくれませんか? あるいは、外部のソースを。
Re: (スコア:0)
なんで誰でも分かってる様な調べりゃすぐ出てくる既出なことを説明せにゃならんのだね
それをすることで我々にどんなメリットがありますか?
#しかも、あなたは多分説明しても分からないレベルでしょうに
Re: (スコア:1, 興味深い)
AMD64なら32bitと64bitのコードがシームレスに実行できるといっても、現実的には64bitModeとCompatibilityModeの切り換えは必要なので、同一OSインスタンス上で32bitのプロセスと64bitのプロセスが同居できるという意味です。
(64bitModeのまま従来の32bitのコードを実行できるといっても、CPUが命令をデコードして実行できるだけであって、プログラマが望むような動作をするわけではありません。)
64bitのEXEから32bitのDLLを呼び出せない、32bitのEXEから64bitのDLLを呼び出せないという仕様は当然です。Win32APIのDLLならExportしているプロシージャの引数の仕様が明らかですからthunkを作ることができてWOW64がそうしていますが、しかし、サードパーティのDLLのためのthunkはマイクロソフトには作れません。サードパーティがthunkを提供するなら64bit版のDLLをビルドして提供したほうがいいでしょう。
Re: (スコア:0)
AMD64のモード切り換えはセグメントで自動的に行われるので「シームレス」。これはIA64のようにモード遷移のための命令が必要ないことを指している。
Win32ではプロセスにフラットなメモリ空間が提供されるが、仮想アドレスが重複しないように複数のセグメントが配置されている。ユーザーのコードがセグメント切り換えを意識しないだけで、CPUが自動的にセグメントを切り換えている。したがって、AMD64では同一プロセス内に64bit Modeで走らせるコードセグメントとCompatibility Modeで走らせるコードセグメントを混在させることが可能。
しかし、そ
Re:64bit版Windowsのタコな仕様はItaniumのせい (スコア:1)
このあたりずっと疑問に思っていたので。
32bitのEXEから64bitのDLLを呼び出せないのは分かる(気がする)のですが、64bit
のEXEから32bitのDLLを呼び出せないのが解せないです。64bitのコードを4GB未満
のアドレス空間を使わないように配置するだけではダメなんでしょうか?
プラグインなどの32bit資産が64bitから自由に使えれば64bitへの移行は少しは楽
になるので、この方向だけサポートしてくれれば良かったのにと思ってしまいます。
Re: (スコア:0)
まず、DLLのExport関数の引数で渡すポインタ。
DLLに渡す可能性のあるものを区別し最初から4GB未満の空間に配置するか、Export関数の呼び出し前後で4GB未満の空間との間でコピーする必要がある。コピーは、ただの文字列なら簡単だけど、ポインタを含んだ構造体へのポインタともなると、厄介だ。そして、32bitのポインタと64bitのポインタの混在はバグの温床になる。
次に、スタック。
DLLを呼び出す可能性のあるスレッドのスタックは4GB
Re:64bit版Windowsのタコな仕様はItaniumのせい (スコア:1)
十分に理解できていませんが、とりあえずスタックの問題は大変難しそうだと想像できました。
ポイントを教えていただけたのでもうちょっと勉強してみます。