Polecenie Linux, aby zwrócić liczbę bitów (32 lub 64)?

13

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?

WilliamKF
źródło
1
@Sathya: To nie jest dokładnie duplikat, ponieważ procesor może być 64-bitowy, nawet jeśli Linux nie jest.
Gilles 'SO - przestań być zły'

Odpowiedzi:

13
  • 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).

Gilles „SO- przestań być zły”
źródło
3
W systemach GNU (i innych, jeśli go mają) powinieneś być w stanie zrobić getconf WORD_BITlub getconf LONG_BITzamiast kompilować swój własny program C (choćby trywialny i przenośny).
Wstrzymano do odwołania.
@Dennis: Dzięki za korektę. Nie myślałem o użyciu 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 .
Gilles 'SO - przestań być zły'
Jest .brakuje w regex: grep '^flags.*:.*\blm\b' /proc/cpuinfo. Również działa tylko dla mnie bez -qflagi
byf-ferdy
@ byf-ferdy Nie brakowało .: 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ę.
Gilles „SO- przestań być zły”
@Gilles ah Nie wiedziałem o -qfladze. Ty, teraz działa :)
byf-ferdy
3

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.

Wuffers
źródło
3
Cokolwiek innego i używasz 32-bit, lub sprzętu non-PC (takich jak alpha, sparc64, ppc64, ...
Gilles 'SO- przestać być zła'
@Gilles: Dzięki, odpowiednio zredagowałem swoją odpowiedź.
Wuffers
2
uname -m | sed 's/x86_//;s/i[3-6]86/32/'
WilliamKF
źródło
1

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

Podróżujący facet techniczny
źródło
1
To nie jest pytanie.
harrymc
1

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
Rachel Duncan
źródło