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/init
ejecutable 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
linux
64bit
32bit
cpu-architecture
kiiwii
fuente
fuente
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 lalm
bandera, es una CPU de 64 bits.Por defecto,
uname -m
oarch
muestra la arquitectura para la que se compiló el núcleo. Linux puede establecer la "personalidad" de un proceso (con lapersonality
) llamada al sistema. Puede ejecutar un subproceso en una personalidad diferente con elsetarch
comando;setarch i686 someprogram
olinux32 someprogram
ejecuta el programa especificado en un entorno dondeuname -m
regresai686
whilesetarch amd64 someprogram
olinux64 someprogram
ejecuta el programa especificado en un entorno dondeuname -m
regresaamd64
.file /sbin/init
le dice para qué arquitecturainit
se 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.$HOSTYPE
es una variable bash y te dice para qué arquitecturabash
se compiló el programa.getconf LONG_BIT
le 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 imprimasizeof(void*)
osizeof(size_t)
: las llamadasgetconf
solo pueden proporcionar información sobre lo quegetconf
cree que es el compilador predeterminado.fuente