Wszystkie procesory obsługujące zestaw instrukcji x64 (znany również jako x86_64 lub amd64) obsługują również zestaw instrukcji x86 (znany również jako i386 lub i686, które są ściśle określonymi wersjami x86). To samo dotyczy ARM A64 (nowy 64-bitowy zestaw instrukcji pojawiający się w ARMv8) i A32 (nazwa „klasycznego” 32-bitowego zestawu instrukcji), dla SPARC64 i SPARC , i wierzę w MIPS64 i MIPS . Tak więc we wszystkich tych rodzinach architektury, jeśli procesor może uruchamiać kod 64-bitowy, może również uruchamiać kod 32-bitowy.
Jądro Linux obsługuje uruchamianie 32-bitowego kodu użytkownika z 64-bitowym jądrem (myślę, że we wszystkich wyżej wymienionych rodzinach architektur). Jądro musi być jednorodne (wszystkie 64-bitowe lub wszystkie 32-bitowe), a każdy proces musi być jednorodny, ale możesz mieć mieszankę 32-bitowych i 64-bitowych procesów na 64-bitowym jądrze. Odwrotna sytuacja nie jest możliwa: w przypadku jądra 32-bitowego nie można uruchamiać procesów 64-bitowych.
Jest to wybór projektowy w systemie Linux, motywowany chęcią uruchomienia istniejących 32-bitowych plików binarnych w 64-bitowych instalacjach. Inne warianty Uniksa dokonały różnych wyborów: Solaris może uruchamiać programy 64-bitowe na jądrze 32-bitowym, a także odwrotnie, podczas gdy OpenBSD nie może uruchamiać programów 32-bitowych na jądrze 64-bitowym.
Możesz uzyskać informacje o procesorze w /proc/cpuinfo
. Jeśli twój procesor x86 ma lm
flagę, jest to procesor 64-bitowy.
Domyślnie uname -m
lub arch
pokazuje architekturę, dla której jądro zostało skompilowane. Linux może ustawić „osobowość” procesu (z personality
) wywołaniem systemowym. Za pomocą polecenia możesz uruchomić podproces w innej osobowości setarch
; setarch i686 someprogram
lub linux32 someprogram
uruchamia określony program w środowisku, w którym uname -m
zwraca i686
, setarch amd64 someprogram
lub linux64 someprogram
uruchamia określony program w środowisku, w którym uname -m
zwraca amd64
.
file /sbin/init
mówi dla jakiej architektury init
jest skompilowany program. Chociaż możliwe jest mieszanie 32-bitowych i 64-bitowych plików wykonywalnych w instalacji, zwykle wszystkie podstawowe programy systemu operacyjnego mają tę samą architekturę, ponieważ jest o wiele łatwiejsze do zarządzania.
$HOSTYPE
jest zmienną bash i mówi, dla jakiej architektury bash
został skompilowany program.
getconf LONG_BIT
informuje, czy domyślny kompilator C jest skonfigurowany do kompilacji programów 32-bitowych czy 64-bitowych. Bardziej precyzyjnym testem jest skompilowanie i uruchomienie programu, który drukuje sizeof(void*)
lub sizeof(size_t)
- wywołanie getconf
może dostarczyć tylko informacji o tym, co getconf
uważa za domyślny kompilator.