Todos os processadores que suportam o conjunto de instruções x64 (também conhecido como x86_64 ou amd64) também suportam o conjunto de instruções x86 (também conhecido como i386 ou i686, que são estritamente versões específicas do x86). O mesmo vale para o ARM A64 (o novo conjunto de instruções de 64 bits que aparece no ARMv8) e o A32 (o nome do conjunto de instruções "clássico" de 32 bits), para o SPARC64 e SPARC , e acredito para o MIPS64 e o MIPS . Portanto, em todas essas famílias de arquitetura, se um processador pode executar código de 64 bits, também pode executar código de 32 bits.
O kernel Linux suporta a execução de código de usuário de 32 bits com um kernel de 64 bits (em todas as famílias de arquitetura mencionadas acima, eu acho). O kernel deve ser homogêneo (todos os de 64 ou 32 bits) e cada processo deve ser homogêneo, mas você pode ter uma mistura de processos de 32 e 64 bits em um kernel de 64 bits. O inverso não é possível: com um kernel de 32 bits, você não pode executar processos de 64 bits.
Essa é uma opção de design no Linux, motivada pelo desejo de executar binários de 32 bits existentes em instalações de 64 bits. Outras variantes do Unix fizeram escolhas diferentes: o Solaris pode executar programas de 64 bits em um kernel de 32 bits e vice-versa, enquanto o OpenBSD não pode executar programas de 32 bits em um kernel de 64 bits.
Você pode obter informações sobre o CPU no /proc/cpuinfo
. Se a sua CPU x86 tem o lm
sinalizador, é uma CPU de 64 bits.
Por padrão, uname -m
ou arch
mostra a arquitetura para a qual o kernel foi compilado. O Linux pode definir a "personalidade" de um processo (com a personality
) chamada do sistema. Você pode executar um subprocesso com uma personalidade diferente com o setarch
comando; setarch i686 someprogram
ou linux32 someprogram
executa o programa especificado em um ambiente onde uname -m
os retornos i686
, enquanto setarch amd64 someprogram
ou linux64 someprogram
executa o programa especificado em um ambiente onde uname -m
os retornos amd64
.
file /sbin/init
informa para qual arquitetura o init
programa é compilado. Embora seja possível misturar executáveis de 32 e 64 bits em uma instalação, geralmente todos os programas principais do SO são da mesma arquitetura, porque é muito mais fácil de gerenciar.
$HOSTYPE
é uma variável bash e indica para qual arquitetura o bash
programa foi compilado.
getconf LONG_BIT
permite saber se o compilador C padrão está configurado para compilar programas de 32 ou 64 bits. Um teste mais preciso é compilar e executar um programa que imprima sizeof(void*)
ou sizeof(size_t)
- chamar getconf
só pode fornecer informações sobre o que getconf
pensa ser o compilador padrão.