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 lmflag, è una CPU a 64 bit.
Per impostazione predefinita, uname -mo archmostra 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 setarchcomando; setarch i686 someprogramo linux32 someprogramesegue il programma specificato in un ambiente in cui uname -mritorna i686mentre setarch amd64 someprogramo linux64 someprogramesegue il programma specificato in un ambiente in cui uname -mritorna amd64.
file /sbin/initti 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_BITti 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 getconfpuò solo fornire informazioni su ciò che getconfpensa sia il compilatore predefinito.