パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Microsoft が Itanium 向け開発終了を宣言」記事へのコメント

  • x64版Windowsで64bitコード←→32bitコード間の呼び出しができない(thunkがない)のは、Itanium版Windowsの仕様に合わせたから。
    そのせいで64bitコードと32bitコードをシームレスに実行できるAMD64のメリットがWindowsにおいては全く生かされていない。

    言わばItaniumの負の遺産。
    後方互換性にこだわるMicrosoftのことだから、128bit版Windowsが出るまでこの仕様に悩まされそうorz

    • Re: (スコア:1, すばらしい洞察)

      by Anonymous Coward
      デタラメを言ってるように見えます。

      もう少し具体的に説明してくれませんか? あるいは、外部のソースを。
      • by Anonymous Coward

        なんで誰でも分かってる様な調べりゃすぐ出てくる既出なことを説明せにゃならんのだね
        それをすることで我々にどんなメリットがありますか?

        #しかも、あなたは多分説明しても分からないレベルでしょうに

        • Re: (スコア:1, 興味深い)

          by Anonymous Coward
          デタラメを言う人ほど説明を嫌がって逃げますね。

          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をビルドして提供したほうがいいでしょう。
          • by Anonymous Coward on 2010年04月08日 15時55分 (#1745635)
            微妙に間違っているゾ

            AMD64のモード切り換えはセグメントで自動的に行われるので「シームレス」。これはIA64のようにモード遷移のための命令が必要ないことを指している。

            Win32ではプロセスにフラットなメモリ空間が提供されるが、仮想アドレスが重複しないように複数のセグメントが配置されている。ユーザーのコードがセグメント切り換えを意識しないだけで、CPUが自動的にセグメントを切り換えている。したがって、AMD64では同一プロセス内に64bit Modeで走らせるコードセグメントとCompatibility Modeで走らせるコードセグメントを混在させることが可能。

            しかし、そのような機構で、32bitのオブジェクトコードと64bitのオブジェクトコードがシームレスにlinkできるからといっても、何の配慮もなしに連係プレーが成立するわけじゃない。
            正しく動作するためには、
            選択肢A) 64bitのコードでもプロセスのアドレス空間を4GB未満に制限する・・・本末転倒
            選択肢B) 64bitのコードを32bitポインタと64bitポインタを器用に使い分けて書く・・・near/farポインタの再来
            選択肢C) 64bitのポインタを32bitのポインタに変換すべくマーシャリングを行う・・・オーバーヘッド大、マーシャリング出来ないものもある
            などが考えられるが、どれも選びたくない。

            マイクロソフトが選んだ
            選択肢D) 32bitと64bitのコードの混在はさせない
            これは結果的にIA64版と同じだけど、IA64版の仕様を引き継いだわけではなく、仮にIA64版が存在しなくても、同じことだったと思う。
            親コメント
            • なんか詳しい方がいらしているようなので、教えていただけるとありがたいです。
              このあたりずっと疑問に思っていたので。

              32bitのEXEから64bitのDLLを呼び出せないのは分かる(気がする)のですが、64bit
              のEXEから32bitのDLLを呼び出せないのが解せないです。64bitのコードを4GB未満
              のアドレス空間を使わないように配置するだけではダメなんでしょうか?

              プラグインなどの32bit資産が64bitから自由に使えれば64bitへの移行は少しは楽
              になるので、この方向だけサポートしてくれれば良かったのにと思ってしまいます。
              親コメント
              • by Anonymous Coward
                64bitのEXEから32bitのDLLを呼び出すためには、32bitのDLLが触るもの全てを4GB未満のアドレス空間に配置しなくてはなりませんが、これが大変なんです。

                まず、DLLのExport関数の引数で渡すポインタ。
                DLLに渡す可能性のあるものを区別し最初から4GB未満の空間に配置するか、Export関数の呼び出し前後で4GB未満の空間との間でコピーする必要がある。コピーは、ただの文字列なら簡単だけど、ポインタを含んだ構造体へのポインタともなると、厄介だ。そして、32bitのポインタと64bitのポインタの混在はバグの温床になる。

                次に、スタック。
                DLLを呼び出す可能性のあるスレッドのスタックは4GB
              • 解説ありがとうございます。
                十分に理解できていませんが、とりあえずスタックの問題は大変難しそうだと想像できました。
                ポイントを教えていただけたのでもうちょっと勉強してみます。
                親コメント
            • by Anonymous Coward

              そもそも64bitだというだけで、AMD64版がItanium版の系譜だと思いこんでる人が異常なんじゃないかと。
              #全然別のアーキテクチャだし64bit版WindowsはむしろIA32ベースじゃないのかと言いたい

              • by Anonymous Coward
                OS内部はともかくとして、ユーザーに見せている部分はIA64版とAMD64版は(ほぼ)同じです。
                IA64版で整備したものがAMD64版でも踏襲されています。

犯人はmoriwaka -- Anonymous Coward

処理中...