Pregunta

En mi equipo OS X, el kernel es un binario de 32 bits y, sin embargo, puede ejecutar un binario de 64 bits.¿Cómo funciona esto?

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
¿Fue útil?

Solución

La CPU se puede cambiar 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 desde las aplicaciones de espacio de usuario de 64 bits.

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

Por lo tanto, mezclar un kernel de 32 bits y binarios de 64 bits puede funcionar, y viceversa.Lo que no puede hacer es mezclar bibliotecas de 32 bits con una aplicación de 64 bits, ya que los punteros que se pasan entre ellas se truncarían.MacOS X ofrece más marcos en versiones de 32 y 64 bits en cada versión.

Otros consejos

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

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

Pero eso no es algo de lo que debas preocuparte.

Tenga en cuenta que no todo Los kernels de 32 bits son capaces de ejecutar procesos de 64 bits.Windows ciertamente no tiene esta propiedad y nunca la he visto en Linux.

El kernel de 32 bits que es capaz de cargar y ejecutar binarios de 64 bits debe tener algún código de 64 bits para manejar el mapeo de memoria, la carga de programas y algunos otros problemas de 64 bits.

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

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

Pero el núcleo desnudo en sí probablemente no cambiará las tareas más rápido, etc., si fuera de 64 bits.

Este es especialmente el caso cuando la mayoría de las personas todavía ejecutan aplicaciones de 32 bits, por lo que el cambio de modo no siempre es necesario, aunque es una operación de poca sobrecarga, lleva algo de tiempo.

-Adán

Un archivo ELF32 puede contener instrucciones de 64 bits y ejecutarse en modo de 64 bits.Lo único que tiene es que la organización del encabezado y los símbolos está 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 tienen 32 bits de ancho, etc.Un archivo que contiene código de 64 bits y código de 32 bits puede exponerse como un archivo ELF de 32 bits donde utiliza registros de 64 bits para sus cálculos internos.mach_kernel es uno de esos ejecutables.La ventaja que obtiene es que se pueden vincular controladores ELF de 32 bits.Si se encarga de pasar punteros que se encuentran por debajo de 4 GB a otros binarios ELF vinculados, funcionará bien.

Que el kernel sea de 64 bits solo traería la ventaja efectiva de que las extensiones del kernel (es decir, normalmente los 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;deben ser nativos de la arquitectura del kernel en ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top