2011-02-22 11 views
7

En esta página, http://www.x86-64.org/pipermail/discuss/2004-August/005020.html Dijo que hay una manera de mezclar el código de 32 bits y el código de 64 bits en una aplicación. Supuso que la aplicación es de 32 bits (en modo compatibilidad) y luego cambia al modo de 64 bits para ejecutar el código de 64 bits y viceversa.¿Es posible ejecutar código de 32 bits en un proceso de 64 bits haciendo el cambio de modo?

Supongamos que mi sistema operativo es de 64 bits Linux y mi aplicación es de 64 bits. Hago un salto lejano para cambiar al modo de compatibilidad y ejecutar el código de 32 bits. ¿Funciona correctamente cuando hago una llamada al sistema o una llamada a una función?

¿Hay alguna sobrecarga de modo de conmutación entre el modo de compatibilidad y el modo de 64 bits? Creo que uno de los gastos generales es que necesito una pila separada para 32 bits y 64 bits.

¿Podría integrar esta idea en JVM, quizás pueda generar código de 32 bits dinámico en JVM de 64 bits y ejecutarlo mediante el cambio de modo?

+0

Si está utilizando una JVM de 64 bits, ¿por qué desea generar código de 32 bits? Puede hacer todas las operaciones de 32 bits que desee (casi) en código de 64 bits; la mayoría de las instrucciones son predeterminadas para los operandos de 32 bits incluso en el modo de 64 bits. –

+1

Porque quiero comparar la diferencia entre el código de 32 bits y el código de 64 bits. Tal vez pueda obtener la diferencia en algún caso, como el tamaño del tipo largo, o el tiempo de ejecución para cada caso. –

+0

Lee de nuevo la publicación, sugiere modificar la CS: esto invocaría 'ld.so' personalizado y cosas así. Asegúrate de estar preparado para eso. –

Respuesta

1

Los syscalls de código abierto deberían estar bien, ya que su código de 32 bits usará el punto de entrada del kernel de 32 bits.

Las llamadas a funciones solo se pueden realizar a otros códigos de 32 bits, por supuesto. Esto incluye libc, por lo que su código de 32 bits deberá ser independiente o deberá proporcionar los procesos necesarios para las funciones de biblioteca que necesite. Recuerde que generalmente las llamadas a los sistemas no se llaman directamente, normalmente pasa por un contenedor libc que no estará disponible para su código de 32 bits.

Sin duda hay una sobrecarga para cambiar de modo. Debería consultar la documentación de su procesador para averiguar de qué se trata.

+0

En su opinión, tengo que preparar 2 versiones diferentes de libc (32 bits y 64 bits), pero ¿es posible cargar bibliotecas de 32 bits y de 64 bits en un ejecutable, incluso carga dinámica utilizando dlopen? Creo que no es posible. –

+1

@ Hsiao-Hui Chiu: No, generalmente no sería posible, y eso no es lo que quieres hacer de todos modos. Dos '' libc' diferentes significarían dos conjuntos de búferes stdio conflictivos y problemas similares. En cambio, necesitaría escribir procesadores de 32 bits que volvieran al modo largo y luego llamar a la libc de 64 bits, incluida la combinación necesaria de parámetros y resultados. – caf

Cuestiones relacionadas