Como determinar o bitness do hardware e do sistema operacional?

4

A saída de uname -a na minha máquina RHEL 5.4 é:

Linux <machine name> 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

Significa que o hardware é de 64 bits (passando talvez pela primeira vez x86_64) e o SO também é de 64 bits pela última x86_64?

Além disso, quais são essas tantas instâncias de x86_64?
Posso instalar o vm de 64 bits no SO de 32 bits e vice-versa?

    
por xyz 16.11.2011 / 13:27

3 respostas

4

O hardware, o kernel e os programas de espaço do usuário podem ter diferentes tamanhos de palavras¹.

  • Você pode ver se a CPU é de 64 bits, 32 bits ou capaz de ambas, verificando a linha flags em /proc/cpuinfo . Você precisa conhecer os possíveis sinalizadores em sua família de arquitetura. Por exemplo, nas plataformas i386 / amd64, o sinalizador lm identifica as CPUs compatíveis com amd64 (as CPUs que não possuem esse sinalizador são apenas i386).

    grep -q '^flags *:.*\blm\b' /proc/cpuinfo    # Assuming a PC
    
  • Você pode ver se o kernel é de 32 bits ou 64 bits, consultando a arquitetura com uname -m . Por exemplo, i[3456]86 são de 32 bits, enquanto x86_64 é de 64 bits. Observe que, em várias arquiteturas, um kernel de 64 bits pode executar programas de usuário 32 bits, portanto, mesmo que o uname -m mostre um 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
    
  • Você pode ver o que está disponível no userland consultando o suporte LSB com o lsb_release comando. Mais precisamente, lsb-release -s imprime uma lista separada por : de recursos LSB suportados. Cada recurso possui o formato module-version-architecture . Por exemplo, a disponibilidade de uma biblioteca ix86 C é indicada por core-2.0-ia32 , enquanto core-2.0-amd64 é 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.

  • Você pode ver quais programas de arquitetura no sistema são criados com um comando como file /bin/ls . Note que é possível ter um sistema misto; mesmo que ls seja um programa de 64 bits, seu sistema pode ter bibliotecas instaladas para executar programas de 32 bits e (menos comumente) vice-versa.

  • Você pode descobrir o tamanho de palavra preferido 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) . Você pode obter as mesmas informações de maneira um pouco menos confiável² executando o comando getconf LONG_BIT .

    #include <stdio.h>
    int main() {
        printf("%d\n", (int)sizeof(void*));
        return 0;
    }
    

Quanto às máquinas virtuais, se você pode executar uma VM de 64 bits em um sistema de 32 bits ou vice-versa, depende da sua tecnologia de máquina virtual. Veja em particular Como posso instalar uma máquina virtual Linux de 64 bits em um Linux de 32 bits?

¹ “Tamanho do Word” é o nome usual para o que você chama de bitness.
² Pode não ser confiável se alguém instalou um compilador C alternativo com uma arquitetura de destino diferente, mas manteve o padrão do sistema getconf .

    
por 17.11.2011 / 01:17
0

Veja man uname .

Você pode compilar e executar programas de 32 bits em uma máquina de 64 bits (embora isso exija uma configuração especial), mas não pode executar binários de 64 bits em um sistema de 32 bits. O mesmo se aplica a muitas máquinas virtuais, mas nem todas * . Então, se você tem um kernel de 64 bits, não há como o seu hardware ser de 32 bits.

Se você quiser testar para que bitness um programa binário é feito, execute file /path/to/the/program .

* Isso depende do nível em que uma determinada Máquina Virtual opera: Aqueles que executam código binário (quase) diretamente na CPU do host, não poderão executar o código de 64 bits em um computador de 32 bits. hospedeiro. Aqueles que emem uma certa CPU podem fazê-lo, mas são menos eficientes devido ao nível de emulação.

    
por 16.11.2011 / 13:37
0

Você se perguntou sobre as várias ocorrências x86_64 de uname :

x86_64 x86_64 x86_64

São esses três valores ( "omit -p e -i se desconhecido" )

    -m, --machine 
          print the machine hardware name
    -p, --processor
          print the processor type or "unknown"
    -i, --hardware-platform
          print the hardware platform or "unknown"

Observe que -p e -i não fazem parte do padrão POSIX . Os valores são unknown no Debian, portanto, o uname imprime x86_64 apenas uma vez. Red Hat / CentOS define o valor.

Leia também: Como o Linux uname -m obtém suas informações? e Por que o uname -p e uname -m e o arco geram diferentes arquiteturas? .

    
por 24.03.2015 / 02:15