2008-09-08 11 views
24

En mi caja OS X, el núcleo es un binario de 32 bits y aún puede ejecutar un binario de 64 bits. ¿Cómo funciona esto?¿Cómo es que un kernel de 32 bits puede ejecutar un binario de 64 bits?

 
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

[¿Cómo ejecuta OSX los binarios de 64 bits mientras se ejecuta en un Kernel de 32 bits?] (Https://superuser.com/q/340549/241386) –

Respuesta

43

La CPU puede pasar del modo de ejecución de 64 bits a 32 bits cuando entra en el contexto del kernel, y aún se puede construir un kernel de 32 bits para comprender las estructuras pasadas de las aplicaciones de espacio de usuario de 64 bits.

El kernel de MacOS X no desreferencia directamente los punteros de la aplicación de usuario de todos modos, ya que reside en su propio espacio de direcciones. Un puntero de espacio de usuario en una llamada ioctl, por ejemplo, debe resolverse primero a su dirección física y luego a una nueva dirección virtual creada en el espacio de direcciones del kernel. Realmente no importa si ese puntero en el ioctl fue de 64 bits o 32 bits, el kernel no lo desreferencia directamente en ninguno de los casos.

Así que la mezcla de un kernel de 32 bits y binarios de 64 bits puede funcionar, y viceversa. Lo que no se puede hacer es mezclar bibliotecas de 32 bits con una aplicación de 64 bits, ya que los punteros pasados ​​entre ellos se truncarán. MacOS X proporciona más de sus frameworks en versiones de 32 y 64 bits en cada lanzamiento.

+1

¿Significa que el kernel de 32 bits debe tener en cuenta los punteros de 64 bits, dado que tiene que convertirlo? –

6

No es el kernel el que ejecuta el binario. Es el procesador.

El binario llama a las funciones de la biblioteca y esas deben ser de 64 bits. Y si necesitan hacer una llamada al sistema, es su responsabilidad hacer frente al hecho de que ellos mismos son de 64 bits, pero el kernel es solo 32.

Pero eso no es algo de lo que deba preocuparse.

0

Para que el kernel sea de 64 bits solo aportaría la ventaja efectiva de que las extensiones de kernel (es decir, típicamente controladores) podrían ser de 64 bits. De hecho, necesitaría tener todas las extensiones del kernel de 64 bits, o (como es el caso ahora) todas las de 32 bits; necesitan ser nativos de la arquitectura del kernel en ejecución.

+0

y mientras haya hardware barato que requiera controladores de terceros baratos, no lo haga espera que los kernels de 64 bits sucedan en el corto plazo :-) – pilif

+0

Windows de 64 bits requiere controladores de 64 bits, y el kernel se ejecuta en modo de 64 bits. No puede ejecutar controladores de 32 bits en Windows de 64 bits. El ejemplo anterior es OS X, que no tiene una versión separada de 32 contra 64 bits (solo la capacidad de ejecutar aplicaciones de 64 bits en x64 con un kernel de 32 bits). –

+0

NT y OSX ambos se ejecutan en micro núcleos, lo que podría hacer 32 <-> interruptores de modo de 64 bits cuando se pasa el mensaje. Aunque desaceleraría las cosas. –

2

El kernel de 32 bits que es capaz de cargar y ejecutar binarios de 64 bits tiene que tener un código de 64 bits para manejar la asignación de memoria, la carga del programa y algunos otros problemas de 64 bits.

Sin embargo, el programador y muchas otras operaciones del sistema operativo no requieren trabajar en el modo de 64 bits para tratar otros problemas: cambia el procesador al modo de 32 bits y viceversa según sea necesario para manejar controladores, tareas, Asignación y asignación de memoria, interrupciones, etc.

De hecho, la mayoría de las cosas que hace el sistema operativo no necesariamente ejecutan una ejecución más rápida a 64 bits: el sistema operativo no es un procesador de datos pesado, y las partes que son (transmisiones, E/S de disco, etc.) probablemente se conviertan a 64 bits (de todos modos, complementos para el sistema operativo).

Pero el kernel desnudo probablemente no cambie de tarea más rápido, etc., si fuera de 64 bits.

Este es especialmente el caso cuando la mayoría de las personas aún ejecuta aplicaciones de 32 bits, por lo que la conmutación de modo no siempre es necesaria, aunque se trata de una operación aérea baja, lleva algo de tiempo.

-Adam

6

Tenga en cuenta que no todos los núcleos de 32 bits son capaces de ejecutar procesos de 64 bits. Windows ciertamente no tiene esta propiedad y nunca lo he visto en Linux.

+1

La línea de asunto no, pero la etiqueta osx sí. – gabr

+0

Entendido, me lo perdí. Esperemos que la comparación sea útil para otros tropiezos en esta pregunta. Voy a editar el texto un poco. –

+0

Linus nunca permitiría esta funcionalidad en Linux, incluso lanzó un ataque sobre PAE. –

1

Un archivo ELF32 puede contener instrucciones de 64 bits y ejecutarse en modo de 64 bits. Lo único que está teniendo es que la organización del encabezado y los símbolos están en formato de 32 bits. Los desplazamientos de la tabla de símbolos son de 32 bits. Las entradas de la tabla de símbolos son de 32 bits de ancho, etc. Un archivo que contiene tanto el código de 64 bits como el código de 32 bits puede exponerse como archivos ELF de 32 bits, ya que utiliza registradores de 64 bits para sus cálculos internos. mach_kernel es uno de esos ejecutables. La ventaja es que los controladores ELF de 32 bits pueden vincularse. Si se ocupa de pasar los punteros que se encuentran por debajo de 4 GB a otros binarios ELF vinculados funcionará bien.

Cuestiones relacionadas