Todos os processadores que suportam o conjunto de instruções x64 (também conhecido como x86_64 ou amd64) também suportam o x86 conjunto de instruções (também conhecido como i386 ou i686, que são estritamente falando versões específicas de x86). O mesmo vale para ARM A64 (o novo conjunto de instruções de 64 bits que aparece no ARMv8) e A32 (o nome para o “ conjunto de instruções de 32 bits clássico), para SPARC64 e SPARC , e acredito que por MIPS64 e MIPS . Portanto, em todas essas famílias de arquitetura, se um processador puder executar código de 64 bits, ele também poderá executar código de 32 bits.
O kernel do Linux suporta a execução de códigos de terra 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 de 64 bits ou todos os 32 bits) e cada processo deve ser homogêneo, mas você pode ter uma mistura de processos de 32 bits e 64 bits em um kernel de 64 bits. O contrário não é possível: com um kernel de 32 bits, você não pode executar processos de 64 bits.
Esta é 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, bem como o inverso, enquanto o OpenBSD não pode executar programas de 32 bits em um kernel de 64 bits.
Você pode obter informações sobre a CPU em /proc/cpuinfo
. Se sua CPU x86 tiver o sinal lm
, é 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 o sistema personality
) ligar. Você pode executar um subprocesso com uma personalidade diferente com o comando setarch
; setarch i686 someprogram
ou linux32 someprogram
executa o programa especificado em um ambiente em que uname -m
retorna i686
enquanto setarch amd64 someprogram
ou linux64 someprogram
executa o programa especificado em um ambiente em que uname -m
retorna amd64
.
file /sbin/init
indica para qual arquitetura o programa init
é compilado. Embora seja possível misturar executáveis de 32 e 64 bits em uma instalação, geralmente todos os programas principais do sistema operacional são da mesma arquitetura, porque é muito mais fácil de gerenciar.
$HOSTYPE
é uma variável bash e informa a arquitetura para a qual o programa bash
foi compilado.
getconf LONG_BIT
permite que você saiba 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 qual getconf
acha que é o compilador padrão.