2012-03-30 2 views
2

Das Betriebssystem OS X Lion (10.7) läuft auf meist 64-Bit-Binärdateien, wie vom Aktivitätsmonitor gemeldet. Angesichts dessen, und die Tatsache, dass mein Laptop eine 32-Bit-Version des EFI und damit auch einen 32-Bit-Kernel ausführt, wie funktioniert das Bogenmischen im Allgemeinen?Darwin-Kernel-Architektur und OS X, 64bit auf 32-Bit-Kernel, wie funktioniert das?

Darwin Kernel Version 11.3.0: Thu Jan 12 18:48:32 PST 2012; root:xnu-1699.24.23~1/RELEASE_I386 

Normalerweise würde man 32b Binärdateien auf x86_64 laufen, aber umgekehrt erfordern würde die CPU in den 64b-Modus drücken, die AFAIK kann nicht rückgängig gemacht werden.

Hoffnung diese Frage klar genug ist ..

Antwort

4

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.

+1

Schöne Antwort, +1 :) – Macmade

1

Der EFI und der Kern sind zwei verschiedene Dinge ...
Sie ein 32-Bit-EFI mit einem 64-Bit-Kernel haben. Nicht der Punkt hier ...

Lions Kernel läuft in der Regel standardmäßig 64-Bit-Modus, es sei denn, Sie zwingen es im 32-Bit-Modus zu betreiben.

Was Sie "Bogenmischen" nennen, wird vom x86_64-Standard garantiert.
Der 64-Bit-Modus ist vollständig abwärtskompatibel mit 32-Bit-Code.

Das Ausführen von 64-Bit-Code mit 32-Bit-Modus ist nicht möglich.
Aber Apples Mach-O-Format löst dies, da Sie Binärdateien erstellen können, die 32-Bit- und 64-Bit-Code bietet.

EDIT

Offenbar Mac OS X nicht über einen Gesamt-32/64-Bit-CPU-Modus.
Ich weiß wirklich nicht, wie das möglich ist, und wie es das Zeug intern mit der CPU verwaltet.

Aber es scheint, dass jedes Programm unter seinem «bestmöglichen Modus» läuft.
So war ich nur falsch, 64bits nativen Code mit einem 32-Bit-Kernel ausgeführt werden kann ...

Werden versuchen, weiter zu suchen ...:)

+0

Danke für die Antwort. Offensichtlich bootet mein System immer den 32-Bit-Kernel, wie von uname gemeldet. Meine Frage war mehr darüber, wie es möglich ist, dass 64B-Code auf einem 32B-Kernel läuft. Ich weiß, die umgekehrte Situation ist üblich, dh auf Linux, Win, etc – overscore

+1

Siehe die Bearbeitung ...:) Sehr nette Frage übrigens ... – Macmade