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 lm
bandera, es una CPU de 64 bits.
Por defecto, uname -m
o arch
muestra 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 setarch
comando; setarch i686 someprogram
o linux32 someprogram
ejecuta el programa especificado en un entorno donde uname -m
regresa i686
while setarch amd64 someprogram
o linux64 someprogram
ejecuta el programa especificado en un entorno donde uname -m
regresa amd64
.
file /sbin/init
le dice para qué arquitectura init
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é arquitectura bash
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 imprima sizeof(void*)
o sizeof(size_t)
: las llamadas getconf
solo pueden proporcionar información sobre lo que getconf
cree que es el compilador predeterminado.