Dane wyjściowe z 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
Jednak /sbin/init
plik wykonywalny jest wyświetlany jako 32-bitowy:
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
Inne aspekty systemu również wydają się zaprzeczać:
root@debian:~ # echo $HOSTTYPE
i486
root@debian:~ # getconf LONG_BIT
32
linux
64bit
32bit
cpu-architecture
kiiwii
źródło
źródło
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 malm
flagę, jest to procesor 64-bitowy.Domyślnie
uname -m
lubarch
pokazuje architekturę, dla której jądro zostało skompilowane. Linux może ustawić „osobowość” procesu (zpersonality
) wywołaniem systemowym. Za pomocą polecenia możesz uruchomić podproces w innej osobowościsetarch
;setarch i686 someprogram
lublinux32 someprogram
uruchamia określony program w środowisku, w którymuname -m
zwracai686
,setarch amd64 someprogram
lublinux64 someprogram
uruchamia określony program w środowisku, w którymuname -m
zwracaamd64
.file /sbin/init
mówi dla jakiej architekturyinit
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 architekturybash
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 drukujesizeof(void*)
lubsizeof(size_t)
- wywołaniegetconf
może dostarczyć tylko informacji o tym, cogetconf
uważa za domyślny kompilator.źródło