@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).
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.
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
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 / amd64lm
flaga identyfikuje procesory obsługujące amd64 (procesory, które nie mają tej flagi, to tylko i386).Możesz sprawdzić, czy jądro jest 32-bitowe czy 64-bitowe, sprawdzając architekturę za pomocą
uname -m
. Na przykładi[3456]86
są 32-bitowe, ax86_64
64-bitowe. Zauważ, że na kilku architekturach 64-bitowe jądro może uruchamiać 32-bitowe programy użytkownika, więc nawet jeśliuname -m
pokazuje 64-bitowe jądro, nie ma gwarancji, że biblioteki 64-bitowe będą dostępne.Zauważ też, że
uname -m
może zwrócić „zwirtualizowaną” wartość. Na przykład pod Linuksem, jeślisetarch i386 bash
działasz na systemie amd64 i uruchamiasz sięuname -m
z tego basha, zobaczyszuname -m
raportowaniei386
. 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*)
lubsizeof(size_t)
.źródło
getconf WORD_BIT
lubgetconf 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 systemiegetconf
powinien się stosować doc89
lubc99
w$(getconf PATH)
, ale w praktyce martwiłbym się, że ktoś zainstaluje alternatywny,cc
który jest obsługiwany przezc89
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 jakalpha
,sparc
lubppc64
.źródło
alpha
,sparc64
,ppc64
, ...źródło
Rodzaj:
Jeśli się pojawi,
x86_64 GNU/Linux
używasz 64-bitowego jądra. Jeśli otrzymasz coś podobnego doi386/i486/i586/i686
, najprawdopodobniej używasz 32-bitowego jądraźródło
getconf używa najmniej wywołań systemowych:
źródło