Che cos'è un comando Linux che posso eseguire per restituire a livello di codice 32 o 64 per indicare se il processore è un processore a 32 o 64 bit?
Che cos'è un comando Linux che posso eseguire per restituire a livello di codice 32 o 64 per indicare se il processore è un processore a 32 o 64 bit?
Risposte:
Si può vedere se la CPU è a 64-bit, 32-bit, o in grado sia controllando la flags
riga /proc/cpuinfo
. Devi conoscere le possibili bandiere sulla tua famiglia di architettura. Ad esempio, sulle piattaforme i386 / amd64, il lm
flag identifica le CPU compatibili con amd64 (le CPU che non hanno quel flag sono solo i386).
grep -q '^flags\s*:.*\blm\b' /proc/cpuinfo # Assuming a PC
Puoi vedere se il kernel è a 32-bit o 64-bit interrogando l'architettura con uname -m
. Ad esempio, i[3456]86
sono a 32 bit mentre a x86_64
64 bit. Si noti che su diverse architetture, un kernel a 64 bit può eseguire programmi userland a 32 bit, quindi anche se uname -m
mostra un kernel a 64 bit, non vi è alcuna garanzia che saranno disponibili librerie a 64 bit.
[ "$(uname -m)" = "x86_64" ] # Assuming a PC
Si noti inoltre che uname -m
potrebbe restituire un valore "virtualizzato". Ad esempio, sotto Linux, se corri setarch i386 bash
su un sistema amd64 e corri uname -m
da quella bash, vedrai dei uname -m
rapporti i386
. Ciò ti consente di far finta di essere su un "sistema a 32 bit" anche se il kernel è a 64 bit, ad esempio per compilare programmi a 32 bit senza impostare la compilazione incrociata.
Puoi vedere cosa è disponibile in userland interrogando il supporto LSB con il lsb_release
comando. Più precisamente, lsb_release -s
stampa un :
elenco separato di funzioni LSB supportate. Ogni funzione ha il modulo . Ad esempio, la disponibilità di una libreria ix86 C è indicata da , mentre è l'analogo per amd64. Tuttavia, non tutte le distribuzioni dichiarano tutti i moduli LSB disponibili, quindi potrebbero essere disponibili più quantità di quelle rilevabili in questo modo.module-version-architecture
core-2.0-ia32
core-2.0-amd64
Puoi scoprire la dimensione della parola preferita per lo sviluppo (supponendo che sia disponibile un compilatore C) compilando un programma C a 5 righe che stampa sizeof(void*)
o sizeof(size_t)
.
getconf WORD_BIT
o getconf LONG_BIT
invece di compilare il tuo programma C (banale e portatile, sebbene lo sia).
getconf
qui. Suona bene in linea di principio, ma è difficile garantire che i risultati si applichino al particolare compilatore C che utilizzerai, se ce n'è più di uno (in genere gcc / icc o simile su Linux, gcc / native cc altrove). Su un sistema standard getconf
dovrebbe applicarsi c89
o c99
entrare $(getconf PATH)
, ma in pratica mi preoccuperei che qualcuno installi un alternativo cc
che viene eseguito dal c89
wrapper del fornitore .
.
mancante nella regex: grep '^flags.*:.*\blm\b' /proc/cpuinfo
. Inoltre funziona solo per me senza la -q
bandiera
.
: avevo "zero o più spazi", ma in realtà c'è una scheda. Ho modificato regexp per consentire anche le schede. Con il -q
flag, non c'è output, ma lo stato di uscita del comando indica se il flag è presente. Se si desidera l'output, rimuovere il -q
flag.
-q
bandiera. Ty, funziona ora :)
È possibile utilizzare uname -a
e cercare per x86_64
vedere se si esegue a 64 bit. Tutto il resto (Per quanto ne so) e si esegue a 32 bit o siete su hardware non PC, come alpha
, sparc
o ppc64
.
alpha
, sparc64
, ppc64
, ...
Genere:
uname -a
Se ottieni x86_64 GNU/Linux
stai eseguendo un kernel a 64 bit. Se ottieni qualcosa di simile i386/i486/i586/i686
probabilmente stai eseguendo un kernel a 32 bit
getconf utilizza il minor numero di chiamate di sistema:
$ 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