Jakie polecenie w systemie Linux można uruchomić, aby programowo zwrócić 32 lub 64, aby wskazać, czy procesor jest procesorem 32- czy 64-bitowym?
Jakie polecenie w systemie Linux można uruchomić, aby programowo zwrócić 32 lub 64, aby wskazać, czy procesor jest procesorem 32- czy 64-bitowym?
Odpowiedzi:
Możesz sprawdzić, czy procesor jest 64-bitowy, 32-bitowy, czy może oba te funkcje, sprawdzając wejście flags
liniowe /proc/cpuinfo
. Musisz znać możliwe flagi swojej rodziny architektury. Na przykład na platformach i386 / amd64 lm
flaga identyfikuje procesory obsługujące amd64 (procesory, które nie mają tej flagi, to tylko i386).
grep -q '^flags\s*:.*\blm\b' /proc/cpuinfo # Assuming a PC
Możesz sprawdzić, czy jądro jest 32-bitowe czy 64-bitowe, sprawdzając architekturę za pomocą uname -m
. Na przykład i[3456]86
są 32-bitowe, a x86_64
64-bitowe. Zauważ, że na kilku architekturach 64-bitowe jądro może uruchamiać 32-bitowe programy użytkownika, więc nawet jeśli uname -m
pokazuje 64-bitowe jądro, nie ma gwarancji, że biblioteki 64-bitowe będą dostępne.
[ "$(uname -m)" = "x86_64" ] # Assuming a PC
Zauważ też, że uname -m
może zwrócić „zwirtualizowaną” wartość. Na przykład pod Linuksem, jeśli setarch i386 bash
działasz na systemie amd64 i uruchamiasz się uname -m
z tego basha, zobaczysz uname -m
raportowanie i386
. Pozwala to skutecznie udawać, że korzystasz z „systemu 32-bitowego”, nawet jeśli jądro jest 64-bitowe, na przykład do kompilacji programów 32-bitowych bez konfiguracji kompilacji krzyżowej.
Aby zobaczyć, co jest dostępne w przestrzeni użytkownika, zapytaj o obsługę LSB za pomocą lsb_release
polecenia. Dokładniej, lsb_release -s
drukuje oddzielną :
listę obsługiwanych funkcji LSB. Każda funkcja ma formę . Na przykład dostępność biblioteki ix86 C jest oznaczona przez , podczas gdy jest to analog dla amd64. Jednak nie każda dystrybucja deklaruje wszystkie dostępne moduły LSB, więc może być dostępnych więcej, niż można w ten sposób wykryć.module-version-architecture
core-2.0-ia32
core-2.0-amd64
Możesz znaleźć preferowany rozmiar słowa do programowania (zakładając, że dostępny jest kompilator C), kompilując 5-liniowy program C, który drukuje sizeof(void*)
lub sizeof(size_t)
.
getconf WORD_BIT
lub getconf LONG_BIT
zamiast kompilować swój własny program C (choćby trywialny i przenośny).
getconf
tutaj. Zasadniczo brzmi to ładnie, ale trudno jest upewnić się, że wyniki odnoszą się do konkretnego kompilatora C, którego będziesz używać, jeśli jest ich więcej (zazwyczaj gcc / icc lub podobny w Linuksie, gcc / native cc gdzie indziej). W standardowym systemie getconf
powinien się stosować do c89
lub c99
w $(getconf PATH)
, ale w praktyce martwiłbym się, że ktoś zainstaluje alternatywny, cc
który jest obsługiwany przez c89
opakowanie dostawcy .
.
brakuje w regex: grep '^flags.*:.*\blm\b' /proc/cpuinfo
. Również działa tylko dla mnie bez -q
flagi
.
: miałem „zero lub więcej spacji”, ale tak naprawdę jest tabulator. Zmieniłem wyrażenie regularne, aby zezwolić również na tabulatory. W przypadku -q
flagi nie ma danych wyjściowych, ale status wyjścia polecenia informuje, czy flaga jest obecna. Jeśli chcesz otrzymać dane wyjściowe, usuń -q
flagę.
-q
fladze. Ty, teraz działa :)
Możesz użyć uname -a
i poszukać, x86_64
czy korzystasz z wersji 64-bitowej. Coś jeszcze (o ile wiem) i używasz 32-bitowej lub jesteś na sprzęcie non-PC, takich jak alpha
, sparc
lub ppc64
.
alpha
, sparc64
, ppc64
, ...
Rodzaj:
uname -a
Jeśli się pojawi, x86_64 GNU/Linux
używasz 64-bitowego jądra. Jeśli otrzymasz coś podobnego do i386/i486/i586/i686
, najprawdopodobniej używasz 32-bitowego jądra
getconf używa najmniej wywołań systemowych:
$ strace getconf LONG_BIT | wc -l
253
$ strace arch | wc -l
280
$ strace uname -m | wc -l
281
$ strace grep -q lm /proc/cpuinfo | wc -l
301