のx86-64アーキテクチャはかなり複雑です。 64ビットモードと32ビットモードを持つだけでなく、2つのメインモード(ロングとレガシー)があり、それぞれにはいくつかのサブモードがあります(Wikipedia article参照)。
レガシーモードでは、CPUが本質的に32ビットCPUをエミュレートします。さまざまなサブモード(リアル、プロテクトなど)を持ちますが、64ビットの命令やアドレッシングを切り替える機能はありません。一般に、非64ビット対応OSはこのモードで動作します。
ロングモードでは、CPUは64ビットの機能を備えていますが、32ビットおよび16ビットの「互換性」モードでも実行できます。モード切り替えは、コードセグメント記述子のLとDフラグによって制御されます(「64ビットワールドのx86の拡張」を参照してください)。基本的に、メモリの異なるセクションは64,32、または16ビットコードであり、CPUは現在実行しているコードセグメントに適したモードに切り替わります。カーネルのコードセグメントは、実行中のアプリケーションのコードセグメントとは独立して、64ビットまたは32ビットとしてフラグを立てることができます。
ですから、原理的には単純です。実際には、私は気づいていない複雑な問題があると確信しています(コンテキスト切り替えプロセスについてはあまり知らない)が、OSが「知っている」限り64ビットで動作しているCPUを使用してコードセグメント記述子を適切に構成すると、32ビットカーネルで64ビットプロセスを実行する際に根本的な問題はありません。
また、OS Xでは、バージョン10.3まで、PowerPC G5 CPUの32ビットカーネルで64ビットプロセスを実行することもできました。 PPC CPUはアーキテクチャがまったく異なり、モード切り替えがどのように機能しているかわかりません。
Nice answer、+1 :) – Macmade