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 flagsriga /proc/cpuinfo. Devi conoscere le possibili bandiere sulla tua famiglia di architettura. Ad esempio, sulle piattaforme i386 / amd64, il lmflag 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]86sono a 32 bit mentre a x86_6464 bit. Si noti che su diverse architetture, un kernel a 64 bit può eseguire programmi userland a 32 bit, quindi anche se uname -mmostra 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 -mpotrebbe restituire un valore "virtualizzato". Ad esempio, sotto Linux, se corri setarch i386 bashsu un sistema amd64 e corri uname -mda quella bash, vedrai dei uname -mrapporti 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_releasecomando. Più precisamente, lsb_release -sstampa 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-architecturecore-2.0-ia32core-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_BITo getconf LONG_BITinvece di compilare il tuo programma C (banale e portatile, sebbene lo sia).
getconfqui. 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 getconfdovrebbe applicarsi c89o c99entrare $(getconf PATH), ma in pratica mi preoccuperei che qualcuno installi un alternativo ccche viene eseguito dal c89wrapper del fornitore .
.mancante nella regex: grep '^flags.*:.*\blm\b' /proc/cpuinfo. Inoltre funziona solo per me senza la -qbandiera
.: avevo "zero o più spazi", ma in realtà c'è una scheda. Ho modificato regexp per consentire anche le schede. Con il -qflag, non c'è output, ma lo stato di uscita del comando indica se il flag è presente. Se si desidera l'output, rimuovere il -qflag.
-qbandiera. Ty, funziona ora :)
È possibile utilizzare uname -ae cercare per x86_64vedere 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, sparco ppc64.
alpha, sparc64, ppc64, ...
Genere:
uname -a
Se ottieni x86_64 GNU/Linuxstai eseguendo un kernel a 64 bit. Se ottieni qualcosa di simile i386/i486/i586/i686probabilmente 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