¿Comando de Linux para devolver el número de bits (32 o 64)?


13

¿Qué es un comando de Linux que puedo ejecutar para devolver programáticamente 32 o 64 para indicar si el procesador es un procesador de 32 bits o de 64 bits?


1
@Sathya: Eso no es exactamente un duplicado, porque el procesador puede ser de 64 bits incluso si Linux no lo es.
Gilles 'SO- deja de ser malvado'

Respuestas:


13
  • Puede ver si la CPU es de 64 bits, 32 bits o capaz de ambas cosas al registrar la flagslínea /proc/cpuinfo. Tienes que conocer las posibles banderas en tu familia de arquitectura. Por ejemplo, en plataformas i386 / amd64, el lmindicador identifica las CPU con capacidad amd64 (las CPU que no tienen ese indicador son solo i386).

    grep -q '^flags\s*:.*\blm\b' /proc/cpuinfo    # Assuming a PC
    
  • Puede ver si el núcleo es de 32 bits o de 64 bits consultando la arquitectura con uname -m. Por ejemplo, i[3456]86son de 32 bits mientras que x86_64es de 64 bits. Tenga en cuenta que en varias arquitecturas, un núcleo de 64 bits puede ejecutar programas de usuario de 32 bits, por lo que incluso si uname -mmuestra un núcleo de 64 bits, no hay garantía de que las bibliotecas de 64 bits estén disponibles.

    [ "$(uname -m)" = "x86_64" ]    # Assuming a PC
    

    Tenga en cuenta también que uname -mpuede devolver un valor "virtualizado". Por ejemplo, en Linux, si ejecuta setarch i386 bashen un sistema amd64 y ejecuta uname -mdesde ese bash, verá uname -minformes i386. Esto efectivamente le permite fingir que está en un "sistema de 32 bits" a pesar de que el núcleo es de 64 bits, por ejemplo, para compilar programas de 32 bits sin configurar la compilación cruzada.

  • Puede ver lo que está disponible en userland consultando el soporte de LSB con el lsb_releasecomando. Más precisamente, lsb_release -simprime una :lista separada de las funciones LSB compatibles. Cada característica tiene la forma . Por ejemplo, la disponibilidad de una biblioteca ix86 C se indica mediante , mientras que es el análogo para amd64. Sin embargo, no todas las distribuciones declaran todos los módulos LSB disponibles, por lo que puede haber más disponible de lo que se puede detectar de esta manera.module-version-architecturecore-2.0-ia32core-2.0-amd64

  • Puede encontrar el tamaño de palabra preferido para el desarrollo (suponiendo que haya un compilador C disponible) compilando un programa C de 5 líneas que imprima sizeof(void*)o sizeof(size_t).


3
En los sistemas GNU (y otros si lo tienen), debería ser capaz de hacer getconf WORD_BITo en getconf LONG_BITlugar de tener que compilar su propio programa C (trivial y portátil, aunque lo sea).
Pausado hasta nuevo aviso.

@ Dennis: Gracias por la corrección. No había pensado en usar getconfaquí. Suena bien en principio, pero es difícil asegurarse de que los resultados se apliquen al compilador de C particular que usará, si hay más de uno (generalmente gcc / icc o similar en Linux, gcc / native cc en otro lugar). En un sistema estándar getconfdebería aplicarse c89ao c99en $(getconf PATH), pero en la práctica me preocuparía que alguien instale una alternativa ccque se ejecuta por el c89contenedor del proveedor .
Gilles 'SO- deja de ser malvado'

Hay una .falta en la expresión regular: grep '^flags.*:.*\blm\b' /proc/cpuinfo. También solo funciona para mí sin la -qbandera
byf-ferdy

@ byf-ferdy No faltaba .: tenía "cero o más espacios", pero en realidad hay una pestaña. También he cambiado la expresión regular para permitir pestañas. Con el -qindicador, no hay salida, pero el estado de salida del comando le indica si el indicador está presente. Si desea salida, elimine la -qbandera.
Gilles 'SO- deja de ser malvado'

@Gilles ah, no sabía sobre la -qbandera. Ty, funciona ahora :)
byf-ferdy

3

Puede usar uname -ay buscar para x86_64ver si está ejecutando 64 bits. Todo lo demás (Por lo que yo sé) y está ejecutando 32 bits o se usa hardware de PC no como alpha, sparco ppc64.


3
Cualquier otra cosa y se está ejecutando 32 bits, o hardware no sea un PC (como alpha, sparc64, ppc64, ...
Gilles 'SO- estar parada mal'

@Gilles: Gracias, edité mi respuesta en consecuencia.
Wuffers


1

Tipo:

uname -a

Si consigues x86_64 GNU/Linux, estás ejecutando un kernel de 64 bits. Si obtiene algo similar i386/i486/i586/i686, probablemente esté ejecutando un kernel de 32 bits


1
Esa no es la pregunta.
harrymc

1

getconf usa la menor cantidad de llamadas al 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.