Comando Linux para retornar o número de bits (32 ou 64)?
13
O que é um comando do Linux que eu posso executar para retornar programaticamente 32 ou 64 para indicar se o processador é um processador de 32 ou 64 bits?
@Sathya: Isso não é exatamente uma duplicata, porque o processador pode ser de 64 bits, mesmo que o Linux não seja.
Gilles
Respostas:
13
Você pode ver se a CPU é de 64 bits, 32 bits ou capaz de ambos, verificando a flagslinha /proc/cpuinfo. Você precisa conhecer os possíveis sinalizadores da sua família de arquitetura. Por exemplo, nas plataformas i386 / amd64, o lmsinalizador identifica CPUs compatíveis com amd64 (as CPUs que não possuem esse sinalizador são apenas i386).
grep -q '^flags\s*:.*\blm\b' /proc/cpuinfo # Assuming a PC
Você pode ver se o kernel é de 32 bits ou 64 bits consultando a arquitetura uname -m. Por exemplo, i[3456]86são 32 bits enquanto x86_64são 64 bits. Observe que, em várias arquiteturas, um kernel de 64 bits pode executar programas de usuário 32 bits, portanto, mesmo se houver uname -mum kernel de 64 bits, não há garantia de que as bibliotecas de 64 bits estarão disponíveis.
[ "$(uname -m)" = "x86_64" ] # Assuming a PC
Observe também que uname -mpode retornar um valor "virtualizado". Por exemplo, no Linux, se você rodar setarch i386 bashem um sistema amd64, e você executar a uname -mpartir desse bash, você verá uname -mrelatórios i386. Isso efetivamente permite que você finja que está em um “sistema de 32 bits”, mesmo que o kernel seja de 64 bits, por exemplo, para compilar programas de 32 bits sem configurar a compilação cruzada.
Você pode ver o que está disponível no userland consultando o suporte do LSB com o lsb_releasecomando. Mais precisamente, lsb_release -simprime uma :lista separada de recursos LSB suportados. Cada recurso tem o formulário . Por exemplo, a disponibilidade de uma biblioteca ix86 C é indicada por , enquanto é o análogo para amd64. Nem todas as distribuições declaram todos os módulos LSB disponíveis, portanto, pode estar disponível mais do que é detectável desta forma.module-version-architecturecore-2.0-ia32core-2.0-amd64
Você pode descobrir o tamanho da palavra preferida para desenvolvimento (supondo que um compilador C esteja disponível) compilando um programa C de 5 linhas que imprime sizeof(void*)ou sizeof(size_t).
Nos sistemas GNU (e outros, se tiverem), você deve ser capaz de fazer getconf WORD_BITou, ao getconf LONG_BITinvés de ter que compilar seu próprio programa C (trivial e portátil, embora seja).
Dennis Williamson
@Dennis: Obrigado pela correção. Eu não tinha pensado em usar getconfaqui. Parece bom, em princípio, mas é difícil garantir que os resultados se apliquem ao compilador C específico que você usará, se houver mais de um (normalmente gcc / icc ou similar no Linux, gcc / cc nativo em outro lugar). Em um sistema padrão getconfdeve aplicar para c89ou c99em $(getconf PATH), mas na prática eu me preocupo com alguém instalar uma alternativa ccque é executado pelo c89wrapper do fornecedor .
Gilles
Há uma .falta no regex: grep '^flags.*:.*\blm\b' /proc/cpuinfo. Também só funciona para mim sem a -qbandeira
byf-ferdy
@ byf-ferdy Não foi uma falta .: eu tinha "zero ou mais espaços", mas na verdade há uma aba. Eu mudei o regexp para permitir abas também. Com o -qsinalizador, não há saída, mas o status de saída do comando informa se o sinalizador está presente. Se você quiser saída, remova o -qsinalizador.
Gilles
@Gilles ah eu não sabia sobre a -qbandeira. Ty, funciona agora :)
byf-ferdy
3
Você pode usar uname -ae procurar para x86_64ver se está executando 64 bits. Qualquer outra coisa (tanto quanto eu sei) e você estiver executando 32 bits ou você está em hardware não-PC, como alpha, sparc, ou ppc64.
Se você perceber x86_64 GNU/Linuxque está rodando um kernel de 64 bits. Se você obtiver algo parecido com o que i386/i486/i586/i686você está provavelmente executando um kernel de 32 bits
Respostas:
Você pode ver se a CPU é de 64 bits, 32 bits ou capaz de ambos, verificando a
flags
linha/proc/cpuinfo
. Você precisa conhecer os possíveis sinalizadores da sua família de arquitetura. Por exemplo, nas plataformas i386 / amd64, olm
sinalizador identifica CPUs compatíveis com amd64 (as CPUs que não possuem esse sinalizador são apenas i386).Você pode ver se o kernel é de 32 bits ou 64 bits consultando a arquitetura
uname -m
. Por exemplo,i[3456]86
são 32 bits enquantox86_64
são 64 bits. Observe que, em várias arquiteturas, um kernel de 64 bits pode executar programas de usuário 32 bits, portanto, mesmo se houveruname -m
um kernel de 64 bits, não há garantia de que as bibliotecas de 64 bits estarão disponíveis.Observe também que
uname -m
pode retornar um valor "virtualizado". Por exemplo, no Linux, se você rodarsetarch i386 bash
em um sistema amd64, e você executar auname -m
partir desse bash, você veráuname -m
relatóriosi386
. Isso efetivamente permite que você finja que está em um “sistema de 32 bits”, mesmo que o kernel seja de 64 bits, por exemplo, para compilar programas de 32 bits sem configurar a compilação cruzada.Você pode ver o que está disponível no userland consultando o suporte do LSB com o
lsb_release
comando. Mais precisamente,lsb_release -s
imprime uma:
lista separada de recursos LSB suportados. Cada recurso tem o formulário . Por exemplo, a disponibilidade de uma biblioteca ix86 C é indicada por , enquanto é o análogo para amd64. Nem todas as distribuições declaram todos os módulos LSB disponíveis, portanto, pode estar disponível mais do que é detectável desta forma.module-version-architecture
core-2.0-ia32
core-2.0-amd64
Você pode descobrir o tamanho da palavra preferida para desenvolvimento (supondo que um compilador C esteja disponível) compilando um programa C de 5 linhas que imprime
sizeof(void*)
ousizeof(size_t)
.fonte
getconf WORD_BIT
ou, aogetconf LONG_BIT
invés de ter que compilar seu próprio programa C (trivial e portátil, embora seja).getconf
aqui. Parece bom, em princípio, mas é difícil garantir que os resultados se apliquem ao compilador C específico que você usará, se houver mais de um (normalmente gcc / icc ou similar no Linux, gcc / cc nativo em outro lugar). Em um sistema padrãogetconf
deve aplicar parac89
ouc99
em$(getconf PATH)
, mas na prática eu me preocupo com alguém instalar uma alternativacc
que é executado peloc89
wrapper do fornecedor ..
falta no regex:grep '^flags.*:.*\blm\b' /proc/cpuinfo
. Também só funciona para mim sem a-q
bandeira.
: eu tinha "zero ou mais espaços", mas na verdade há uma aba. Eu mudei o regexp para permitir abas também. Com o-q
sinalizador, não há saída, mas o status de saída do comando informa se o sinalizador está presente. Se você quiser saída, remova o-q
sinalizador.-q
bandeira. Ty, funciona agora :)Você pode usar
uname -a
e procurar parax86_64
ver se está executando 64 bits. Qualquer outra coisa (tanto quanto eu sei) e você estiver executando 32 bits ou você está em hardware não-PC, comoalpha
,sparc
, ouppc64
.fonte
alpha
,sparc64
,ppc64
, ...fonte
Tipo:
Se você perceber
x86_64 GNU/Linux
que está rodando um kernel de 64 bits. Se você obtiver algo parecido com o quei386/i486/i586/i686
você está provavelmente executando um kernel de 32 bitsfonte
O getconf usa o menor número de chamadas do sistema:
fonte