2008-09-08 2 views
24

In meiner OS X-Box ist der Kernel eine 32-Bit-Binärdatei und kann dennoch eine 64-Bit-Binärdatei ausführen. Wie funktioniert das?Wie kann ein 32-Bit-Kernel eine 64-Bit-Binärdatei ausführen?

 
cristi:~ diciu$ file ./a.out 
./a.out: Mach-O 64-bit executable x86_64 
cristi:~ diciu$ file /mach_kernel 
/mach_kernel: Mach-O universal binary with 2 architectures 
/mach_kernel (for architecture i386): Mach-O executable i386 
/mach_kernel (for architecture ppc): Mach-O executable ppc 
cristi:~ diciu$ ./a.out 
cristi:~ diciu$ echo $? 
1 
+0

[Wie läuft OSX 64-Bit-Binärdateien während der Ausführung auf einem 32-Bit-Kernel?] (Https://superuser.com/q/340549/241386) –

Antwort

43

Die CPU kann vom 64-Bit-Ausführungsmodus auf 32-Bit umgeschaltet werden, wenn sie in den Kernelkontext fällt, und ein 32-Bit-Kernel kann immer noch konstruiert werden, um die von 64-Bit-Benutzerbereichsanwendungen übermittelten Strukturen zu verstehen.

Der MacOS X-Kernel defenet Zeiger aus der Benutzer-App nicht direkt, da er seinen eigenen separaten Adressraum hat. Beispielsweise muss ein User-Space-Pointer in einem ioctl-Aufruf zuerst in seine physikalische Adresse aufgelöst werden und dann eine neue virtuelle Adresse im Adressraum des Kernels. Es spielt keine Rolle, ob dieser Pointer im ioctl 64 Bit oder 32 Bit hat, der Kernel wird ihn in keinem Fall direkt dereferenzieren.

So Mischen eines 32-Bit-Kernel und 64-Bit-Binärdateien können funktionieren, und umgekehrt. Die Sache, die Sie nicht tun können, ist das Mischen von 32-Bit-Bibliotheken mit einer 64-Bit-Anwendung, da die zwischen ihnen übergebenen Zeiger abgeschnitten würden. MacOS X liefert in jeder Version mehr seiner Frameworks in 32- und 64-Bit-Versionen.

+1

Bedeutet dies, dass der 32-Bit-Kernel auf 64-Bit-Zeiger achten muss, da er konvertiert werden muss? –

6

Es ist nicht der Kernel, der die Binärdatei ausführt. Es ist der Prozessor.

Die Binärdatei ruft Bibliotheksfunktionen auf, und diese müssen 64 Bit sein. Und wenn sie einen Systemanruf tätigen müssen, ist es ihre Verantwortung mit der Tatsache umzugehen, dass sie selbst 64bit sind, aber der Kernel ist nur 32.

Aber das ist nicht etwas, worüber man sich sorgen müsste.

0

Für den Kernel zu 64-Bit wäre nur der effektive Vorteil, dass Kernel-Erweiterungen (d. H. In der Regel Treiber) 64-Bit sein könnte. Tatsächlich müssten Sie entweder alle 64-Bit-Kernel-Erweiterungen oder (wie jetzt) ​​alle 32-Bit-Kernel-Erweiterungen haben. Sie müssen in der Architektur des laufenden Kernels nativ sein.

+0

und solange es billige Hardware gibt, die billige Third-Party-Treiber benötigt, nicht erwarte 64bit-Kernel, die bald passieren werden :-) – pilif

+0

64-Bit-Windows benötigt 64-Bit-Treiber und der Kernel läuft im 64-Bit-Modus. Sie können 32-Bit-Treiber unter 64-Bit-Windows nicht ausführen. Das obige Beispiel ist OS X, das keine separate 32- und 64-Bit-Version hat (nur die Möglichkeit, 64-Bit-Anwendungen auf x64 mit einem 32-Bit-Kernel auszuführen). –

+0

NT und OSX beide auf Mikro-Kernel, die 32 <-> 64-Bit-Modus-Schalter bei der Weitergabe von Nachrichten ausführen können. Es würde jedoch die Dinge verlangsamen. –

2

Der 32-Bit-Kernel, der 64-Bit-Binärdateien laden und ausführen kann, muss über 64-Bit-Code verfügen, um Speicherzuordnung, Programmladen und einige andere 64-Bit-Probleme zu behandeln.

Der Scheduler und viele andere Betriebssystem-Operationen müssen jedoch nicht im 64-Bit-Modus arbeiten, um andere Probleme zu beheben - es schaltet den Prozessor auf 32-Bit-Modus und zurück, um Treiber, Tasks, Speicherzuteilung und Zuordnung, Interrupts, etc.

In der Tat, die meisten Dinge, die das OS tut, würde nicht notwendigerweise schneller laufen mit 64 Bits - das Betriebssystem ist kein schwerer Datenprozessor, und diese Teile, die sind (Streams, Disk-I/O, etc.) werden wahrscheinlich in 64-Bit konvertiert (Plugins zum OS sowieso).

Aber der nackte Kernel selbst wird wahrscheinlich nicht schneller schalten, usw., wenn es 64 Bit wäre.

Dies ist besonders der Fall, wenn die meisten Leute noch 32-Bit-Anwendungen ausführen, so dass die Modusumschaltung nicht immer benötigt wird, obwohl das eine geringe Overhead-Operation ist, dauert es eine Weile.

-Adam

6

Beachten Sie, dass nicht alle 32-Bit-Kernel 64-Bit-fähig sind der laufenden Prozesse. Windows hat diese Eigenschaft sicherlich nicht und ich habe es nie unter Linux gesehen.

+1

Betreffzeile nicht, aber das OSX-Tag. – gabr

+0

Verstanden - das habe ich vermisst. Hoffentlich wird der Vergleich nützlich sein, um andere auf diese Frage zu stolpern. Ich werde den Text ein wenig bearbeiten. –

+0

Linux würde diese Funktionalität niemals in Linux zulassen, er warf sogar einen Fit über PAE. –

1

Eine ELF32-Datei kann 64-Bit-Anweisungen enthalten und im 64-Bit-Modus ausgeführt werden. Die einzige Sache ist, dass die Organisation von Header und Symbolen im 32-Bit-Format ist. Die Offsets der Zeichentabelle sind 32 Bit. Die Einträge in der Symboltabelle sind 32 Bit breit usw. Eine Datei, die sowohl 64-Bit-Code als auch 32-Bit-Code enthält, kann sich als 32-Bit-ELF-Datei ausgeben, wenn sie für ihre internen Berechnungen 64-Bit-Register verwendet. Mach_kernel ist eine solche ausführbare Datei. Vorteil ist, dass 32 Bit Treiber ELFs damit verbunden werden können. Wenn es darum geht, Zeiger, die unterhalb von 4 GB liegen, an andere verknüpfte ELF-Binärdateien zu übergeben, wird es gut funktionieren.

Verwandte Themen