質問: osxは32ビットカーネルで実行しているときに64ビットバイナリをどのように実行しますか? 最近、mac os xは、x86カーネルがロードされていても、実際には64ビット(x64)アプリケーションを実行できることがわかりました。それは私にとって初めて衝撃的でした。しかし、x64互換のcpuでシステムが稼働していると、プロセスを管理しているカーネルに関係なく、x64アプリケーションを実行できないのは本当に奇妙だと気づきました。本当に大変ですか?いまいましいアプリをメモリにロードし、cpu操作ポインタを最初のバイトに設定するだけです。パイのように簡単です。私が想像できるように、それを行うための唯一の障壁は、ある種の「実行可能ヘッダー」です。残念ながら、私はwindowsアーキテクチャとバイナリ構造にあまり慣れていないので、ここでさらに説明が必要です。事実上のunixライクなosバイナリヘッダー標準elfには、兄弟elf64があります。これは(ドキュメント ここ で説明されているように)elf32とあまり違いはありませんが、32ビットカーネルは実行できません。 x64コード。はい、このプログラムはx64ライブラリにリンクされている可能性があり、それらをコピーして/ usr/lib64フォルダーに貼り付けたところを想像してみてください。しかし、それは役に立たないと確信しています、なぜですか?そして最後に、mac os xカーネルの何が特別なので、使用されるプログラム命令セットについて心配する必要はありませんか? mac os xには、両方のカーネルの実行可能ファイルヘッダーに適したユニバーサルな機能があります。そのため、アプリをメモリにロードして、cpuに「ここから実行してください。それが何を意味するかは関係ありません」と言うことができますか?追伸:私はこの質問をどこに置くかについて本当によく考えました:stackoverflow.comまたはsuperuser.comで、トピックはおそらくos固有のものであるため、ここに置くことにしました。
回答: 詳細を説明するのにx86_64アーキテクチャに精通していませんが、基本的には、カーネルとユーザースペース間のコンテキスト切り替えの一部としてcpuが64ビットモードと互換性(32ビット)モードの間で切り替えられます。プログラム。これは、64ビットカーネルで32ビットプログラムを実行する場合とほぼ同じですが、逆になります。ところで、os xはelfバイナリ形式を使用せず、 mach-o バイナリを使用します。 mach-o形式ではマルチアーキテクチャ(「ユニバーサル」)バイナリが許可されているため、プログラム(さらに言えばカーネル)は32ビットと64ビットの両方で提供できます(およびppcおよびppc64と...)、osはロード時にロードするバージョン(したがって、それを実行するモード)を選択できます。バイナリでfileコマンドを使用して、それがどのフォーマットであるかを確認できます。たとえば、os xv10.5に同梱されているchessアプリケーションは次のとおりです。$ file applications/chess.app/contents/macos/chess applications/chess.app/contents/macos/chess: mach-o universal binary with 4 architectures applications/chess.app/contents/macos/chess (for architecture ppc): mach-o executable ppc applications/chess.app/contents/macos/chess (for architecture ppc64): mach-o 64-bit executable ppc64 applications/chess.app/contents/macos/chess (for architecture i386): mach-o executable i386 applications/chess.app/contents/macos/chess (for architecture x86_64): mach-o 64-bit executable x86_64 そして、これが可能であると疑う人への注意:os xはv10.4以降の64ビットプログラムをサポートしていましたが(apiサポートは制限されています)、v10.6まで64ビットカーネルは含まれていませんでした(それでも、カーネルは、ほとんどのモデルでデフォルトで32ビットモードで実行されていました)。詳細については、 appleの64ビット移行ガイド を参照してください。 32ビットカーネルで10.6を実行しているmacbookproからこれを投稿しています(この特定のモデルでは64ビットはサポートされていません)が、アクティビティモニターによるとのみ64ビットモードで実行されていないプロセスはkernel_taskです。