Tutti i processori che supportano il set di istruzioni x64 (noto anche come x86_64 o amd64) supportano anche il set di istruzioni x86 (noto anche come i386 o i686, che sono rigorosamente versioni specifiche di x86). Lo stesso vale per ARM A64 (il nuovo set di istruzioni a 64 bit che appare in ARMv8) e A32 (il nome per il "classico" set di istruzioni a 32 bit), per SPARC64 e SPARC , e credo per MIPS64 e MIPS . Quindi su tutte queste famiglie di architettura, se un processore può eseguire codice a 64 bit, può anche eseguire codice a 32 bit.
Il kernel Linux supporta l'esecuzione del codice userland a 32 bit con un kernel a 64 bit (credo su tutte le famiglie di architettura sopra menzionate). Il kernel deve essere omogeneo (tutti a 64 bit o tutti a 32 bit) e ogni processo deve essere omogeneo, ma è possibile disporre di una combinazione di processi a 32 e 64 bit su un kernel a 64 bit. Il contrario non è possibile: con un kernel a 32 bit, non è possibile eseguire processi a 64 bit.
Questa è una scelta progettuale in Linux, motivata dal desiderio di eseguire binari a 32 bit esistenti su installazioni a 64 bit. Altre varianti di Unix hanno fatto diverse scelte: Solaris può eseguire programmi a 64 bit su un kernel a 32 bit e viceversa, mentre OpenBSD non può eseguire programmi a 32 bit su un kernel a 64 bit.
È possibile ottenere informazioni sulla CPU in /proc/cpuinfo
. Se la tua CPU x86 ha il lm
flag, è una CPU a 64 bit.
Per impostazione predefinita, uname -m
o arch
mostra l'architettura per cui è stato compilato il kernel. Linux può impostare la "personalità" di un processo (con la personality
) chiamata di sistema. È possibile eseguire un sottoprocesso con una personalità diversa con il setarch
comando; setarch i686 someprogram
o linux32 someprogram
esegue il programma specificato in un ambiente in cui uname -m
ritorna i686
mentre setarch amd64 someprogram
o linux64 someprogram
esegue il programma specificato in un ambiente in cui uname -m
ritorna amd64
.
file /sbin/init
ti dice per quale architettura init
è stato compilato il programma. Sebbene sia possibile combinare eseguibili a 32 e 64 bit in un'installazione, in genere tutti i principali programmi del sistema operativo provengono dalla stessa architettura, perché è molto più facile da gestire.
$HOSTYPE
è una variabile bash e ti dice per quale architettura bash
è stato compilato il programma.
getconf LONG_BIT
ti consente di sapere se il compilatore C predefinito è impostato per compilare programmi a 32 o 64 bit. Un test più preciso è quello di compilare un ed eseguire un programma che stampa sizeof(void*)
o sizeof(size_t)
- call getconf
può solo fornire informazioni su ciò che getconf
pensa sia il compilatore predefinito.