Die x86-64-Architektur ziemlich komplex ist; es hat nicht nur einen 64-Bit-Modus und einen 32-Bit-Modus, es hat zwei Hauptmodi (lang und alt), jede mit einer Anzahl von Untermodi (siehe Wikipedia article).
Im Legacy-Modus emuliert die CPU im Wesentlichen eine 32-Bit-CPU. Es hat verschiedene Untermodi (real, protected usw.), aber keine Möglichkeit zum Umschalten verwendet 64-Bit-Befehle oder Adressierung. Im Allgemeinen wird ein nicht 64-Bit-fähiges Betriebssystem in diesem Modus ausgeführt.
Im Long-Modus hat die CPU 64-Bit-Fähigkeit, kann aber auch in 32- und 16-Bit- "Kompatibilitäts" -Modi laufen. Die Modusumschaltung wird durch die L- und D-Flags im Codesegmentdeskriptor gesteuert (siehe "Erweitern von x86 für die 64-Bit-Welt" in this PDF) - im Wesentlichen können verschiedene Speicherbereiche als 64-, 32-, oder 16-Bit-Code, und die CPU wechselt in den entsprechenden Modus für das Code-Segment, das gerade ausgeführt wird. Die Codesegmente des Kernels können unabhängig von den Code-Segmenten für laufende Anwendungen als 64- oder 32-Bit markiert werden.
Also im Prinzip ist es einfach. In der Praxis bin ich sicher, dass es viele Komplikationen gibt, die mir nicht bekannt sind (ich weiß nicht wirklich viel über den Kontextwechselprozess), aber solange das Betriebssystem "weiß", läuft es auf einem 64-Bit-System CPU und konfiguriert die Codesegmentdeskriptoren entsprechend, es gibt kein grundsätzliches Problem beim Ausführen von 64-Bit-Prozessen unter einem 32-Bit-Kernel.
BTW, könnte OS X auch 64-Bit-Prozesse unter einem 32-Bit-Kernel auf PowerPC G5 CPUs laufen, so weit zurück wie Version 10.3. PPC-CPUs haben eine völlig andere Architektur, und ich habe keine Ahnung, wie die Modusumschaltung dort funktionierte.
Schöne Antwort, +1 :) – Macmade