Qual é a diferença entre um programa de 32 e 64 bits no Windows?

4

Por que um programa de 64 bits não pode ser executado em uma cópia de 32 bits do Windows? Como meu PC sabe que estou executando um programa de 64 bits? O programa tem um pedaço de código dizendo ao Windows que é um programa de 64 bits ou o Windows simplesmente falha ao executá-lo?

Eu vi uma diferença significativa no tamanho do arquivo das duas versões do mesmo programa, então acho que o código é diferente. É possível modificar o código e fazer o programa rodar?

    
por Avasyu 19.10.2013 / 09:20

3 respostas

8

Disclaimer: Eu nunca escrevi um sistema operacional na minha vida. É melhor esperar alguém mais competente para responder e ler alguns artigos do OSDev nesse meio tempo.

Does the program have a piece of code telling Windows that it's a 64-bit program or does Windows simply fail to execute it?

São ambos.

  • Todos os arquivos executáveis do Windows (.exe, .dll, ... - executáveis do PE em geral) têm um cabeçalho informando ao SO qual arquitetura eles foram compilados. Pode ser Intel x86 (16 bits ou 32 bits) ou x86_64 ou Itanium ou Alpha AXP…

    Se o SO vir uma arquitetura incompatível no cabeçalho, ele se recusará completamente a executar o programa. Em outros casos - se você tentar executar um programa x86 em x86_64, por exemplo - ele saberá que o programa precisa ser executado em um modo diferente do restante.

  • Por outro lado, as instruções reais do código de máquina dentro do programa são diferentes. (A propósito, esse é o ponto de ter arquiteturas diferentes.) A arquitetura x86_64 de 64 bits tem mais instruções do que x86 de 32 bits, e x86 de 32 bits tinha mais instruções que 16 bits. (E coisas como Alpha ou ARM ou Itanium são tão diferentes que há muito pouco que pode ser comparado.)

    (Até CPUs x86 diferentes têm diferentes conjuntos de instruções - ao longo do tempo, acumularam várias dezenas de extensões sobre as mais básicas, por exemplo, conjuntos de instruções "SSE" ou "MMX" ou "AES-NI", então é possível que um programa não rodará em processadores antigos como o Pentium se o compilador tiver permissão para otimizá-lo para os mais novos.)

    E mesmo para instruções básicas que são as mesmas em ambas as arquiteturas, os tamanhos de dados podem ser maiores e, mais importante, os endereços de memória são maiores - as arquiteturas de 64 bits são geralmente chamadas de "64 bits" porque usam 64 bits exprima localizações na memória e assim por diante.

    Assim, mesmo que você tenha editado o cabeçalho manualmente para informar ao SO uma arquitetura diferente, você só acabaria com um programa que falhava todas as vezes.

  • Por outro lado, x86_64 ainda tem as mesmas instruções que o x86 (simplesmente adiciona mais delas), então é relativamente fácil para o SO rodar programas de 32 bits enquanto no modo de 64 bits; na maioria das vezes apenas se preocupa em usar apenas recursos do x86 ao lidar com esse programa. No entanto, o mesmo não se aplica na outra direção - mesmo que o sistema operacional de 32 bits tenha sido escrito para mudar a CPU para o modo de 64 bits para o seu programa, então, de volta, ainda pode acontecer facilmente que o programa tenha feito algo que o sistema operacional não conseguia lidar.

Se você tiver o código-fonte, você pode compilá-lo facilmente para arquiteturas diferentes (supondo que ele esteja escrito corretamente - alguns programas ainda têm suposições como ponteiros de memória sempre com 32 bits…) Mas se você tiver um binário compilado, está sem sorte.

    
por 19.10.2013 / 10:41
2

O número de bits, neste caso, refere-se ao tamanho dos endereços de memória usados pelo computador.

Um sistema de endereço de memória de 32 bits pode apontar para até 2 ^ 32 (4294967296) diferentes locais de memória (que são exatamente 4GB de armazenamento) enquanto 64 bits podem endereçar até 2 ^ 64 locais (~ 16 trilhões GB ).

Por que um programa de 64 bits não pode ser executado em uma cópia de 32 bits do Windows?
Um programa de 32 bits armazena os vários locais onde armazenou seus dados em 32 bits. E como é possível armazenar 32 bits em 64 bits de armazenamento, o Windows executará o programa com satisfação enquanto preenche os outros 32 bits do 64-bit apropriadamente.

Um programa de 64 bits, por outro lado, usa 64 bits para indicar os locais. Como não é possível armazenar 64 bits em um armazenamento de 32 bits sem jogar metade dele, o Windows se recusará a executar um programa de 64 bits em um computador de 32 bits.

O programa tem um pedaço de código dizendo ao Windows que é um programa de 64 bits ou o Windows simplesmente falha ao executá-lo?
Todo programa tem um cabeçalho, que informa ao Windows, tudo o que ele precisa saber sobre como executar o programa, incluindo se for um aplicativo de 32 bits ou um aplicativo de 64 bits.

Eu vi uma diferença significativa no tamanho do arquivo das duas versões do mesmo programa, então acho que o código é diferente. É possível modificar o código e fazer o programa rodar?
64 bits ocupam o dobro da quantidade de memória de 32 bits. É por isso que os programas de 64 bits são maiores que os de 32 bits.

Esses locais de memória formam apenas uma fração de um programa; a maioria delas são instruções (que permanecem do mesmo tamanho) e coisas como texto e ícones. Como apenas os locais de memória dobram de tamanho, a versão de 64 bits de um programa é apenas um pouco maior do que o dobro do tamanho.

Espero que isso ajude.

    
por 19.10.2013 / 10:40
1

Praticamente, há duas diferenças principais entre o executável de 32bits e 64bits. Tamanho e velocidade.

64 bits, acesso a mais memória

32 bits significa que o espaço de endereçamento de um programa varia de 2 a 32 valores inteiros. O que significa que um programa só pode saber contar até 2 ^ 32; Assim, só pode referenciar a memória dentro desse intervalo. Isso é aproximadamente ~ 2GB.

    O programa
  • de 32 bits pode ver / usar no máximo ~ 4 GB de memória. Na prática, é menos do que isso, pois alguns desses intervalos são reservados para o sistema operacional / código.

Como 2 ^ 64 é um número muito maior, é óbvio que os programas 64bits podem acessar uma faixa muito maior de valores; eles podem ver / usar muito mais memória. Grande o suficiente para que você não conheça o prefixo SI: 16 exbibytes. O que é um exbibytes? Grande o suficiente para que ninguém realmente se importe com o futuro previsível.

    O programa
  • de 64 bits pode (praticamente) referir-se a toda a memória que poderia desejar (nesta década).

32 bits, consome um pouco menos de memória, corre um pouco mais rápido

Portanto, parece óbvio que todo o software deve ser compilado para 64bits. Isso é bem verdade, exceto por uma coisa: 32 bits ocupam menos espaço que 64 bits. Isso tem duas conseqüências principais:

  1. O programa 64bits ocupa mais espaço . Cada referência de memória (ponteiro) leva o dobro do tamanho. Essa diferença é geralmente insignificante.
  2. O programa 64bits é executado um pouco mais devagar. Como os ponteiros são maiores, os dados na memória são menos compactados juntos; os vários níveis de cache em sua máquina são preenchidos com menos dados, levando a mais erros de cache. A boa utilização do cache (localidade da memória) é essencial hoje em dia para o software de desempenho, porque a latência . Além disso, algumas operações aritméticas levam tempo proporcional à largura de bit do inteiro; algumas instruções da CPU são mais lentas em 64bits vs 32bits.
por 06.07.2014 / 21:55