A saída 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
No entanto, o /sbin/init
executável 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
Outros aspectos do sistema parecem contradizer as coisas também:
root@debian:~ # echo $HOSTTYPE
i486
root@debian:~ # getconf LONG_BIT
32
linux
64bit
32bit
cpu-architecture
kiiwii
fonte
fonte
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 olm
sinalizador, é uma CPU de 64 bits.Por padrão,
uname -m
ouarch
mostra a arquitetura para a qual o kernel foi compilado. O Linux pode definir a "personalidade" de um processo (com apersonality
) chamada do sistema. Você pode executar um subprocesso com uma personalidade diferente com osetarch
comando;setarch i686 someprogram
oulinux32 someprogram
executa o programa especificado em um ambiente ondeuname -m
os retornosi686
, enquantosetarch amd64 someprogram
oulinux64 someprogram
executa o programa especificado em um ambiente ondeuname -m
os retornosamd64
.file /sbin/init
informa para qual arquitetura oinit
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 obash
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 imprimasizeof(void*)
ousizeof(size_t)
- chamargetconf
só pode fornecer informações sobre o quegetconf
pensa ser o compilador padrão.fonte