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?

WilliamKF
fonte
1
@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).

Gilles
fonte
3
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.

Wuffers
fonte
3
Qualquer outra coisa e você estiver executando 32 bits ou hardware não-PC (como alpha, sparc64, ppc64, ...
Gilles
@Gilles: Obrigado, editei minha resposta de acordo.
Wuffers
2
uname -m | sed 's/x86_//;s/i[3-6]86/32/'
WilliamKF
fonte
1

Tipo:

uname -a

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

Viajando Tech Guy
fonte
1
Essa não é a questão.
harrymc
1

O getconf usa o menor número de chamadas do 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
Rachel Duncan
fonte