¿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?
@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).
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.
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
Respuestas:
Puede ver si la CPU es de 64 bits, 32 bits o capaz de ambas cosas al registrar la
flags
línea/proc/cpuinfo
. Tienes que conocer las posibles banderas en tu familia de arquitectura. Por ejemplo, en plataformas i386 / amd64, ellm
indicador identifica las CPU con capacidad amd64 (las CPU que no tienen ese indicador son solo i386).Puede ver si el núcleo es de 32 bits o de 64 bits consultando la arquitectura con
uname -m
. Por ejemplo,i[3456]86
son de 32 bits mientras quex86_64
es 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 siuname -m
muestra un núcleo de 64 bits, no hay garantía de que las bibliotecas de 64 bits estén disponibles.Tenga en cuenta también que
uname -m
puede devolver un valor "virtualizado". Por ejemplo, en Linux, si ejecutasetarch i386 bash
en un sistema amd64 y ejecutauname -m
desde ese bash, veráuname -m
informesi386
. 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_release
comando. Más precisamente,lsb_release -s
imprime 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-architecture
core-2.0-ia32
core-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*)
osizeof(size_t)
.fuente
getconf WORD_BIT
o engetconf LONG_BIT
lugar de tener que compilar su propio programa C (trivial y portátil, aunque lo sea).getconf
aquí. 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ándargetconf
debería aplicarsec89
aoc99
en$(getconf PATH)
, pero en la práctica me preocuparía que alguien instale una alternativacc
que se ejecuta por elc89
contenedor del proveedor ..
falta en la expresión regular:grep '^flags.*:.*\blm\b' /proc/cpuinfo
. También solo funciona para mí sin la-q
bandera.
: 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-q
indicador, no hay salida, pero el estado de salida del comando le indica si el indicador está presente. Si desea salida, elimine la-q
bandera.-q
bandera. Ty, funciona ahora :)Puede usar
uname -a
y buscar parax86_64
ver 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 comoalpha
,sparc
oppc64
.fuente
alpha
,sparc64
,ppc64
, ...fuente
Tipo:
Si consigues
x86_64 GNU/Linux
, estás ejecutando un kernel de 64 bits. Si obtiene algo similari386/i486/i586/i686
, probablemente esté ejecutando un kernel de 32 bitsfuente
getconf usa la menor cantidad de llamadas al sistema:
fuente