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 flagsliniowe /proc/cpuinfo. Musisz znać możliwe flagi swojej rodziny architektury. Na przykład na platformach i386 / amd64 lmflaga 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]86są 32-bitowe, a x86_6464-bitowe. Zauważ, że na kilku architekturach 64-bitowe jądro może uruchamiać 32-bitowe programy użytkownika, więc nawet jeśli uname -mpokazuje 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 -mmoże zwrócić „zwirtualizowaną” wartość. Na przykład pod Linuksem, jeśli setarch i386 bashdziałasz na systemie amd64 i uruchamiasz się uname -mz tego basha, zobaczysz uname -mraportowanie 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_releasepolecenia. Dokładniej, lsb_release -sdrukuje 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-architecturecore-2.0-ia32core-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_BITlub getconf LONG_BITzamiast kompilować swój własny program C (choćby trywialny i przenośny).
getconftutaj. 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 getconfpowinien się stosować do c89lub c99w $(getconf PATH), ale w praktyce martwiłbym się, że ktoś zainstaluje alternatywny, ccktóry jest obsługiwany przez c89opakowanie dostawcy .
.brakuje w regex: grep '^flags.*:.*\blm\b' /proc/cpuinfo. Również działa tylko dla mnie bez -qflagi
.: 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 -qflagi nie ma danych wyjściowych, ale status wyjścia polecenia informuje, czy flaga jest obecna. Jeśli chcesz otrzymać dane wyjściowe, usuń -qflagę.
-qfladze. Ty, teraz działa :)
Możesz użyć uname -ai poszukać, x86_64czy 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, sparclub ppc64.
alpha, sparc64, ppc64, ...
Rodzaj:
uname -a
Jeśli się pojawi, x86_64 GNU/Linuxuż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