En Linux y Windows, estoy acostumbrado a la situación en la que necesito un núcleo de 64 bits para tener un sistema con multiarch / WoW en el que pueda ejecutar software de 32 bits y de 64 bits en paralelo.
Y luego, hace años, me sorprendió cuando alguien me mostró que MacOS 10.6 Snow Leopard podía ejecutar aplicaciones de 64 bits con el núcleo en modo de 32 bits. Esto puede olvidarse en gran medida ahora porque fue una transición tecnológica única. Con el hardware por delante de la curva en el espacio móvil, hasta donde yo sé, esto nunca fue necesario en el cambio a 64 bits para iOS y Android.
Mi pregunta: ¿Qué se necesitaría para obtener la misma capacidad en un kernel de Linux de 32 bits (i386 o armhf)?
Entiendo que esto probablemente no sea trivial. Si lo fuera, Microsoft podría haber puesto la función en Windows XP de 32 bits. ¿Cuáles son los requisitos generales? ¿Alguna vez se ha propuesto un parche o prueba de concepto?
En el mundo integrado, creo que esto sería especialmente útil, ya que el soporte de 64 bits puede retrasarse durante mucho tiempo en los controladores de dispositivos.
Respuestas:
La ejecución de aplicaciones de 64 bits requiere cierta compatibilidad del núcleo: el núcleo necesita al menos configurar tablas de páginas, tablas de interrupción, etc., según sea necesario para admitir la ejecución del código de 64 bits en la CPU, y debe guardar el total de 64 bits contexto al cambiar entre aplicaciones (y de aplicaciones al núcleo y viceversa). Por lo tanto, un núcleo puramente de 32 bits no puede soportar el espacio de usuario de 64 bits.
Sin embargo, un núcleo puede ejecutar código de 32 bits en el espacio del núcleo, al tiempo que admite código de 64 bits en el espacio del usuario. Eso implica un manejo similar al soporte requerido para ejecutar aplicaciones de 32 bits con un núcleo de 64 bits: básicamente, el núcleo tiene que soportar las interfaces de 64 bits que las aplicaciones esperan. Por ejemplo, tiene que proporcionar algún mecanismo para que el código de 64 bits llame al núcleo y preservar el significado de los parámetros (en ambas direcciones).
La pregunta entonces es si vale la pena. En la Mac y en algunos otros sistemas, se puede hacer un caso ya que admitir el código del núcleo de 32 bits significa que los controladores no tienen que hacer el cambio simultáneamente. En Linux, el modelo de desarrollo es diferente: cualquier cosa en el núcleo se migra según sea necesario cuando se realizan grandes cambios, y cualquier cosa fuera del núcleo no es realmente compatible con los desarrolladores del núcleo. Soportar el área de usuario de 32 bits con un núcleo de 64 bits es ciertamente útil y vale la pena el esfuerzo (al menos, fue cuando se agregó el soporte x86-64), no estoy seguro de que haya un caso para 64 bits en 32 -poco...
fuente
Snow Leopard pudo ejecutar binarios de 64 bits en una CPU Intel de 64 bits.
También fue capaz de arrancar con un kernel de 64 bits cuando su efi ya tenía 64 bits (mi lote de producción del "modelo de transición" Macbook pro ya era una máquina de este tipo).
No hubo emulación involucrada, solo pagó un menor costo de rendimiento al arrancar en modo de 32 bits justo.
En las CPU puras de 32 bits, no podrá hacerlo, ya que no tienen idea de cómo interpretar el código de 64 bits. A menos que esté emulando con software, lo que sería lento para ese tipo de máquinas integradas con poca potencia tradicional.
fuente