Domanda

Sul mio sistema OS X, il kernel è un binario a 32 bit e tuttavia può eseguire un binario a 64 bit.Come funziona?

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
È stato utile?

Soluzione

La CPU può essere commutata dalla modalità di esecuzione a 64 bit a 32 bit quando si intrappola nel contesto del kernel e un kernel a 32 bit può ancora essere costruito per comprendere le strutture passate dalle app dello spazio utente a 64 bit.

In ogni caso, il kernel di MacOS X non dereferenzia direttamente i puntatori dall'app utente, poiché risiede in un proprio spazio di indirizzi separato.Un puntatore allo spazio utente in una chiamata ioctl, ad esempio, deve prima essere risolto nel suo indirizzo fisico e poi in un nuovo indirizzo virtuale creato nello spazio degli indirizzi del kernel.Non importa se il puntatore nell'ioctl era a 64 o 32 bit, in entrambi i casi il kernel non lo dereferenzia direttamente.

Quindi mescolare un kernel a 32 bit e binari a 64 bit può funzionare e viceversa.La cosa che non puoi fare è mescolare librerie a 32 bit con un'applicazione a 64 bit, poiché i puntatori passati tra di loro verrebbero troncati.MacOS X fornisce più framework nelle versioni a 32 e 64 bit in ogni versione.

Altri suggerimenti

Non è il kernel che esegue il binario.E' il processore.

Il binario chiama le funzioni di libreria e quelle devono essere a 64 bit.E se hanno bisogno di fare una chiamata di sistema, è loro responsabilità far fronte al fatto che loro stessi sono a 64 bit, ma il kernel è solo a 32.

Ma non è qualcosa di cui dovresti preoccuparti.

Nota che no Tutto I kernel a 32 bit sono in grado di eseguire processi a 64 bit.Windows certamente non ha questa proprietà e non l'ho mai visto fare su Linux.

Il kernel a 32 bit in grado di caricare ed eseguire file binari a 64 bit deve avere del codice a 64 bit per gestire la mappatura della memoria, il caricamento del programma e alcuni altri problemi a 64 bit.

Tuttavia, non è necessario che lo scheduler e molte altre operazioni del sistema operativo funzionino in modalità a 64 bit per gestire altri problemi: commuta il processore in modalità a 32 bit e viceversa secondo necessità per gestire driver, attività, allocazione di memoria e mappatura , interruzioni, ecc.

In effetti, la maggior parte delle cose che fa il sistema operativo non funzionerebbero necessariamente più velocemente a 64 bit: il sistema operativo non è un processore di dati pesante e quelle parti che lo sono (flussi, I/O del disco, ecc.) vengono probabilmente convertite a 64 bit (plug-in comunque per il sistema operativo).

Ma il kernel nudo stesso probabilmente non cambierà attività più velocemente, ecc., Se fosse a 64 bit.

Ciò è particolarmente vero quando la maggior parte delle persone utilizza ancora app a 32 bit, quindi il cambio di modalità non è sempre necessario, anche se si tratta di un'operazione a basso costo, richiede del tempo.

-Adamo

Un file ELF32 può contenere istruzioni a 64 bit ed essere eseguito in modalità a 64 bit.L'unica cosa che ha è che l'organizzazione dell'intestazione e dei simboli è in formato a 32 bit.Gli offset della tabella dei simboli sono 32 bit.Le voci della tabella dei simboli hanno una larghezza di 32 bit, ecc.Un file che contiene sia codice a 64 bit che codice a 32 bit può esporsi come file ELF a 32 bit in cui utilizza registri a 64 bit per i suoi calcoli interni.mach_kernel è uno di questi eseguibili.Il vantaggio che si ottiene è che è possibile collegarvi i driver ELF a 32 bit.Se si occupa di passare puntatori che si trovano sotto i 4 GB ad altri binari ELF collegati, funzionerà correttamente.

Il fatto che il kernel sia a 64 bit porterebbe solo il vantaggio effettivo che le estensioni del kernel (ovvero, in genere i driver) potrebbero essere a 64 bit.In effetti, dovresti avere tutte le estensioni del kernel a 64 bit o (come nel caso attuale) tutte quelle a 32 bit;devono essere nativi dell'architettura del kernel in esecuzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top