Núcleo de 64 bits, pero todos los procesos ejecutables ELF de 32 bits, ¿cómo es esto?

9

La salida de uname:

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

Sin embargo, el /sbin/initejecutable aparece como 32 bits:

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Otros aspectos del sistema también parecen contradecir las cosas:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32
kiiwii
fuente

Respuestas:

13

El núcleo de 64 bits se puede instalar en Debian de 32 bits. Puede ver que el núcleo amd64 está disponible para Debian de 32 bits en su página de paquete . Esto se puede usar como una alternativa al uso de un núcleo habilitado para PAE para soportar más de 4G de RAM total. Tenga en cuenta que los binarios de 32 bits aún no pueden acceder a más de aproximadamente 3G de RAM por proceso.

jordanm
fuente
¡gracias! sus respuestas son tan claras como una bola de cristal ~: D Nunca noté que Debian trata el paquete de kernel de esta manera antes.
kiiwii
1
Eso no es cierto: los programas de 32 bits pueden usar todo el 4Gio de su espacio de direcciones virtuales cuando se ejecutan en un núcleo de 64 bits (a menos que se ejecuten con la personalidad ADDR_LIMIT_3GB).
ysdx
@ysdx ¿Entonces limitar a 2 GB es algo específico de Windows y se permitirán direcciones superiores a 0x80000000 en el espacio de usuario de 32 bits?
Paul Stelian
1
@PaulStelian, en Windows de 32 bits, está limitado por defecto a los 2 GB más bajos de memoria virtual para la retrocompatibilidad (creo que algunos programas solían reservar punteros a los 2 GB más altos de memoria virtual para fines especiales). Puede configurar el indicador LARGEADDRESSAWARE en su ejecutable ( docs.microsoft.com/fr-fr/cpp/build/reference/… ) para optar por obtener acceso a los 4 GB de memoria virtual.
ysdx
15

Todos los procesadores que admiten el conjunto de instrucciones x64 (también conocido como x86_64 o amd64) también admiten el conjunto de instrucciones x86 (también conocido como i386 o i686, que son estrictamente versiones específicas de x86). Lo mismo ocurre con ARM A64 (el nuevo conjunto de instrucciones de 64 bits que aparece en ARMv8) y A32 (el nombre del conjunto de instrucciones "clásico" de 32 bits), para SPARC64 y SPARC , y creo que para MIPS64 y MIPS . Entonces, en todas estas familias de arquitectura, si un procesador puede ejecutar código de 64 bits, también puede ejecutar código de 32 bits.

El kernel de Linux admite la ejecución de código de usuario de 32 bits con un kernel de 64 bits (creo que en todas las familias de arquitectura mencionadas anteriormente). El núcleo debe ser homogéneo (todos de 64 bits o todos de 32 bits), y cada proceso debe ser homogéneo, pero puede tener una mezcla de procesos de 32 bits y 64 bits en un núcleo de 64 bits. Lo contrario no es posible: con un núcleo de 32 bits, no puede ejecutar procesos de 64 bits.

Esta es una opción de diseño en Linux, motivada por el deseo de ejecutar binarios existentes de 32 bits en instalaciones de 64 bits. Otras variantes de Unix han hecho diferentes elecciones: Solaris puede ejecutar programas de 64 bits en un kernel de 32 bits y viceversa, mientras que OpenBSD no puede ejecutar programas de 32 bits en un kernel de 64 bits.

Puede obtener información sobre la CPU en /proc/cpuinfo. Si su CPU x86 tiene la lmbandera, es una CPU de 64 bits.

Por defecto, uname -mo archmuestra la arquitectura para la que se compiló el núcleo. Linux puede establecer la "personalidad" de un proceso (con la personality) llamada al sistema. Puede ejecutar un subproceso en una personalidad diferente con el setarchcomando; setarch i686 someprogramo linux32 someprogramejecuta el programa especificado en un entorno donde uname -mregresa i686while setarch amd64 someprogramo linux64 someprogramejecuta el programa especificado en un entorno donde uname -mregresa amd64.

file /sbin/initle dice para qué arquitectura initse compila el programa. Aunque es posible mezclar ejecutables de 32 bits y 64 bits en una instalación, generalmente todos los programas principales del sistema operativo son de la misma arquitectura, porque es mucho más fácil de administrar.

$HOSTYPEes una variable bash y te dice para qué arquitectura bashse compiló el programa.

getconf LONG_BITle permite saber si el compilador C predeterminado está configurado para compilar programas de 32 bits o de 64 bits. Una prueba más precisa es compilar ay ejecutar un programa que imprima sizeof(void*)o sizeof(size_t): las llamadas getconfsolo pueden proporcionar información sobre lo que getconfcree que es el compilador predeterminado.

Gilles 'SO- deja de ser malvado'
fuente
1
De hecho, ¿Solaris de 32 bits cambia al modo de 64 bits para cambiar al proceso de 64 bits y luego vuelve? Esto debe tener una sobrecarga enorme, y simplemente no tiene sentido, porque el núcleo es efectivamente de 64 bits.
Ruslan
1
@Ruslan ¿Por qué tendría una sobrecarga enorme? Cambiar modos en un cambio de contexto no cuesta mucho (en todo caso, no sé x86 en un nivel bajo lo suficientemente bien). El núcleo sigue siendo de 32 bits: direcciones virtuales de 32 bits para las asignaciones de núcleo, uso del conjunto de instrucciones de 32 bits.
Gilles 'SO- deja de ser malvado'
1
El núcleo debe mantener algunas estructuras de datos específicas de 64 bits para admitir aplicaciones de 64 bits, al menos tablas de páginas compatibles con 64 bits. Esto hace que no sea realmente un núcleo de 32 bits. No he tratado de profundizar en el arco amd64, pero creo que desactivar el soporte de 64 bits tendrá una sobrecarga considerable en contraste con el uso del modo de compatibilidad especialmente diseñado.
Ruslan
1
@Ruslan Solo tablas de páginas conscientes de 64 bits y realmente necesarias, y es un costo muy pequeño. Todo lo demás se puede evitar con el diseño correcto del núcleo. Nunca he cavado en el núcleo de Solaris, supongo que organizaron para que sea lo suficientemente flexible (tenían experiencia previa con SPARC64).
Gilles 'SO- deja de ser malvado'