6

64 ビット変数を使用する一部の CPU バウンド コードでは、x86 ではなく Amd64 命令セットを使用することをお勧めします。32 ビット Windows (Windows XP SP3 など) ではどのように実行できますか? もちろん、最新の Amd64 対応の CPU を想定しています。Virtualboxの下でAmd64用のUbuntuなど、本格的な64ビットOSを仮想マシンとして実行するという、機能するが重い方法を除外しています。

いくつかのアセンブリが必要であり、特に 32 ビット Windows が管理するよりも多くのメモリをアドレス指定するという制限があることを理解しています。しかし、私は、適度な量のメモリしか必要とせず、外部関数への呼び出しを必要としない純粋な計算タスクを考えています。

4

2 に答える 2

10

32 ビット汎用 OS (カーネルの変更なし/特別なドライバー/ハイパーバイザーなし) で Amd64 命令 (Long モード) を使用する方法はありません。

それの訳は:

1) ネイティブ 64 ビット命令を使用するには、ロング モードに切り替える必要があります。これは特権アクションです。CPU が 64 ビット モードに切り替えられた場合、32 ビット OS カーネルは動作し続けることができないため、カーネルに入る前に元に戻す必要があります。

2) ただし、カーネルは、タイマー (スケジューラ) やその他のハードウェア割り込み (ドライバー) のために、非同期で呼び出されることがよくあります。64 ビット レジスタを保存したり、モードを long から protected に変更したりしません。

32 ビット OS で 64 ビット タスクを実行する特別なドライバーを作成することは可能かもしれませんが、そのようなドライバーは 64 ビット カーネルお​​よびカーネルの動的パッチャーに似ています。私は誰もそのような解決策を知りません。

32 ビット OS で実行している場合、64 ビット ALU と CPU のレジスタにアクセスするために、MMX、SSE、SSE2、SSE3、AVX のみを使用できます。

Linux、一部の BSD、Mac OS X には、64 ビット カーネルを使用するモードがありますが、ユーザー空間のソフトウェアは 32 ビットであると言えます。このような場合、カーネルは 64 ビット モードを認識しており、64 ビット レジスタにアクセスしてタスク スイッチを実行できるため、32 ビット アプリケーションと 64 ビット アプリケーションの両方を実行できます。私の知る限り、MS Windows にはそのようなモード自体はありません (W7 は 32 ビット モードをエミュレートしますが、これは私の MS をシミュレーターと呼んでいるので、カーネル内の機能ではないと思います)。

その他の可能性 (CPU がハードウェア仮想化をサポートしている方がよい) は、32 ビットおよび 64 ビットのゲスト OS で 64 ビット ハイパーバイザー (VMware/Xen、その他の高価なソリューション) を使用することです。VirtualBox は、ハイパーバイザーを使用する別のオプションであり、無料で使用できます。

于 2011-08-20T16:27:32.567 に答える
2

一般に、32 ビット OS カーネルで 64 ビット コードを実行することは、次の理由によりほとんど不可能です。

  • 32 ビット OS は、追加の 64 ビット レジスタ (および既存のレジスタの上位 32 ビット) を認識せず、タスク スイッチ間でそれらを保存しません。
  • 32 ビット OS は、64 ビット コードの実行を有効にする準備ができていません。64 ビット コード実行を有効にするということは、IA-32e ページング (まったく異なるページ テーブル形式が必要) に切り替え、GDT (または LDT) のコード セグメント記述子で CS.L = 1 および CS.D = 0 を設定することを意味します。(IA-32 マニュアル、vol 3a/3b 5.2.1 を参照)

原則として、IA-32e モードで動作する Windows 用の新しい HAL を作成し、64 ビット トランポリン コード セグメントに切り替えて 64 ビット レジスタを保存および復元することで、両方の問題を回避できる場合があります。これはかなり複雑な作業です。詳細については、Windows DDK を参照してください。CPU が VMX をサポートしている場合は、VirtualBox などと同様に、エミュレーション アプローチを使用することもできます。しかし、最初から単純に 64 ビット OS を使用する方がはるかに簡単です。

于 2011-08-20T16:51:57.063 に答える