kernel de 64 bits, mas todos os processos executáveis do ELF de 32 bits, como é isso?

7

A saída de uname :

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

No entanto, o executável /sbin/init aparece como 32 bits:

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Outros aspectos do sistema também parecem contradizer as coisas:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32
    
por kiiwii 04.06.2014 / 04:22

2 respostas

12

O kernel de 64 bits pode ser instalado no Debian 32bit. Você pode ver que o kernel amd64 está disponível para o Debian 32bit em sua página do pacote . Isso pode ser usado como uma alternativa ao uso de um kernel habilitado para PAE para suportar mais de 4G de RAM total. Observe que os binários de 32 bits ainda não podem acessar mais do que aproximadamente 3G de RAM por processo.

    
por 04.06.2014 / 04:40
12

Todos os processadores que suportam o conjunto de instruções x64 (também conhecido como x86_64 ou amd64) também suportam o x86 conjunto de instruções (também conhecido como i386 ou i686, que são estritamente falando versões específicas de x86). O mesmo vale para ARM A64 (o novo conjunto de instruções de 64 bits que aparece no ARMv8) e A32 (o nome para o “ conjunto de instruções de 32 bits clássico), para SPARC64 e SPARC , e acredito que por MIPS64 e MIPS . Portanto, em todas essas famílias de arquitetura, se um processador puder executar código de 64 bits, ele também poderá executar código de 32 bits.

O kernel do Linux suporta a execução de códigos de terra de usuário de 32 bits com um kernel de 64 bits (em todas as famílias de arquitetura mencionadas acima, eu acho). O kernel deve ser homogêneo (todos de 64 bits ou todos os 32 bits) e cada processo deve ser homogêneo, mas você pode ter uma mistura de processos de 32 bits e 64 bits em um kernel de 64 bits. O contrário não é possível: com um kernel de 32 bits, você não pode executar processos de 64 bits.

Esta é uma opção de design no Linux, motivada pelo desejo de executar binários de 32 bits existentes em instalações de 64 bits. Outras variantes do Unix fizeram escolhas diferentes: o Solaris pode executar programas de 64 bits em um kernel de 32 bits, bem como o inverso, enquanto o OpenBSD não pode executar programas de 32 bits em um kernel de 64 bits.

Você pode obter informações sobre a CPU em /proc/cpuinfo . Se sua CPU x86 tiver o sinal lm , é uma CPU de 64 bits.

Por padrão, uname -m ou arch mostra a arquitetura para a qual o kernel foi compilado. O Linux pode definir a “personalidade” de um processo (com o sistema personality ) ligar. Você pode executar um subprocesso com uma personalidade diferente com o comando setarch ; setarch i686 someprogram ou linux32 someprogram executa o programa especificado em um ambiente em que uname -m retorna i686 enquanto setarch amd64 someprogram ou linux64 someprogram executa o programa especificado em um ambiente em que uname -m retorna amd64 .

file /sbin/init indica para qual arquitetura o programa init é compilado. Embora seja possível misturar executáveis de 32 e 64 bits em uma instalação, geralmente todos os programas principais do sistema operacional são da mesma arquitetura, porque é muito mais fácil de gerenciar.

$HOSTYPE é uma variável bash e informa a arquitetura para a qual o programa bash foi compilado.

getconf LONG_BIT permite que você saiba se o compilador C padrão está configurado para compilar programas de 32 ou 64 bits. Um teste mais preciso é compilar e executar um programa que imprima sizeof(void*) ou sizeof(size_t) - chamar getconf só pode fornecer informações sobre qual getconf acha que é o compilador padrão.

    
por 04.06.2014 / 04:51