miniaturadaimagem|Opteron, o primeiro microprocessador a introduzir as extensões x86-64 em 2003. miniaturadaimagem|direita|O conjunto de cinco volumes do x86-64 Architecture Programmer's Manual, publicado e distribuído pela AMD em 2002. AMD64 (também conhecido como x64, x86_64, x86-64 e Intel 64), é a extensão 64 bits do conjunto de instruções x86 em processadores anunciado em 1999. A especificação original foi desenhada pela AMD e é utilizada pelos processadores da AMD, da Intel, da VIA, e outros.
A arquitetura x86-64 define um modo de compatibilidade que permite executar programas x86 (x86-80) de 32-bit ou 16-bit sem qualquer dano a velocidade, enquanto novas aplicações podem tirar proveito das novas funções do design para conseguir melhoras na performance.
A primeira família de processadores a suportar a arquitetura foi a linha AMD K8, nos processadores Opteron e Athlon 64. Esta foi a primeira vez que qualquer empresa, fora a Intel, fez significativas adições à arquitetura x86. A Intel foi obrigada a seguir o exemplo e fez modificações já na família de processadores NetBurst, como o Pentium 4, que se tornou compatível com as especificações da AMD. A VIA Technologies, outro produtor de processadores x86, também incluiu instruções x86-64 na VIA Isaiah, arquitetura utilizada no VIA Nano.
Vários nomes foram usados para o conjunto de instruções. Antes de seu lançamento, x86-64 e x86_64 eram usados, enquanto a AMD o nomeou AMD64 ao anunciá-lo. Intel inicialmente usou os nomes IA-32e e EM64T antes de usar o atual "Intel 64" para sua implementação. Alguns na indústria, como a Apple, usam x86-64 e x86_64, enquanto outros como a Microsoft usa x64. Diversas distribuições Linux usam o termo AMD64.
A especificação x86-64 substituiu e descontinuou a arquitetura Intel Itanium (anteriormente IA-64), que tentava substituir a arquitetura x86, mas não não é compatível no nível nativo do conjunto de instrução com as arquiteturas x86 ou o x86-64.
AMD64 miniaturadaimagem|Logo do AMD64.
História O AMD64 (também referido pela AMD em sua literatura e documentação como “Tecnologia AMD de 64 bits” e “Arquitetura AMD x86-64”) foi criado como uma alternativa à radicalmente diferente arquitetura IA-64, projetada pela Intel e pela Hewlett Packard, que era incompatível com IA-32, a versão de 32 bits da arquitetura x86. A AMD anunciou originalmente o AMD64 em 1999 com uma especificação completa disponível em agosto de 2000. Como a AMD nunca foi convidada para contribuir com a arquitetura IA-64 e qualquer tipo de licenciamento parecia improvável, a arquitetura AMD64 foi posicionada pela AMD desde o início como uma forma evolucionária de adicionar recursos de computação de 64 bits à arquitetura x86 existente enquanto oferece suporte ao código x86 legado de 32 bits, em oposição à abordagem da Intel de criar uma arquitetura de 64 bits totalmente nova e totalmente incompatível com x86 com IA-64.
O primeiro processador baseado no AMD64, o Opteron (para servidores), foi liberado em abril de 2003 e o Athlon 64 (para computadores de mesa - desktops) em setembro de 2003.
Implementações x64 da AMD Os processadores da AMD que implementam a arquitetura AMD64 incluem Opteron, Athlon 64, Athlon 64 X2, Athlon 64 FX, Athlon II (seguido por "X2", "X3" ou "X4" para indicar o número de núcleos e modelos XLT), Turion 64, Turion 64 X2, Sempron ("Palermo" revisão E6 e todos os modelos "Manila"), Phenom, Phenom II (seguido por "X2", " X3", "X4" ou "X6" para indicar o número de núcleos), FX, Fusion/APU e Ryzen/Epyc.
Características A principal característica definidora do AMD64 é seu suporte para registradores de uso geral de 64 bits, operações lógicas e aritméticas inteiras de 64 bits e endereços virtuais de 64 bits. Os projetistas aproveitaram a oportunidade para fazer outras melhorias também. As mudanças mais significativas incluem:
Suporte total para números inteiros de 64 bits Todos os registradores de propósito geral (GPRs) são expandidos de 32 bits para 64 bits, e todas as operações aritméticas e lógicas, operações de memória-para-registrador e registrador-para-memória, etc., agora são suportado diretamente para inteiros de 64 bits. Pushs e pops na pilha estão sempre em passos de oito bytes e os ponteiros têm oito bytes de largura. Registradores adicionais Além de aumentar o tamanho dos registradores de uso geral, o número deles é aumentado de oito (ou seja, , , , , , , , ), em x86-32, para dezesseis (isto é, , , , , , , , , , , , , , , , ). É consequentemente possível manter mais variáveis locais nos registradores do que na pilha, e constantes frequentemente acessadas; os argumentos para sub-rotinas pequenas e rápidas podem igualmente ser passados nos registradores em maior medida. Entretanto, o AMD64 ainda tem poucos registradores do que muitos conjuntos de instruções RISC comuns (que têm tipicamente 32-64 registradores) ou máquinas do tipo VLIW, tais como o IA-64 (que tem 128 registradores). Registradores XMM (SSE) adicionais Similarmente, o número de registradores XMM de 128 bits (usados em instruções Streaming-SIMD) é aumentado igualmente de 8 a 16. Espaço de endereço virtual maior A arquitetura AMD64 define um formato de endereço virtual de 64 bits, dos quais os 48 bits de ordem inferior são usados nas implementações atuais. Isso permite até 256 TB (248 ou 281.474.976.710.656 bytes) de espaço de endereço virtual. A definição da arquitetura permite que esse limite seja aumentado em implementações futuras para 64 bits completos, estendendo o espaço de endereço virtual para 16 EB (264 ou 18.446.744.073.709.551.616 bytes). Isso é comparado a apenas 4 GB (232 ou 4.294.967.296) para o x86. Isso significa que arquivos muito grandes podem ser operados mapeando o arquivo inteiro no espaço de endereço do processo (o que geralmente é muito mais rápido do que trabalhar com chamadas de leitura/gravação de arquivo), em vez de mapear regiões do arquivo para dentro e fora do espaço de endereçamento. Espaço de endereço físico maior A implementação original da arquitetura AMD64 implementava endereços físicos de 40 bits e, portanto, poderia endereçar até 1 TB (240 ou 1.099.511.627.776 bytes) de RAM. As implementações atuais da arquitetura AMD64 (a partir da microarquitetura AMD 10h) estendem isso para endereços físicos de 48 bits e, portanto, podem endereçar até 256 (248 ou 281.474.976.710.656 bytes) TB de RAM. A arquitetura permite estender isso para 52 bits no futuro (limitado pelo formato de entrada da tabela de páginas); isso permitiria o endereçamento de até 4 PB (252 ou 4.503.599.627.370.496 bytes) de RAM. Para comparação, os processadores x86 de 32 bits são limitados a 64 GB (236 ou 68.719.476.736 bytes) de RAM no modo Extensão de Endereço Físico (PAE) ou 4 GB (232 ou 4.294.967.296) de RAM sem o modo PAE. Espaço de endereço físico maior no modo legado Ao operar no modo legado, a arquitetura AMD64 oferece suporte ao modo de Extensão de Endereço Físico (PAE), assim como a maioria dos processadores x86 atuais, mas o AMD64 estende o PAE de 36 bits para um limite arquitetônico de 52 bits de endereço físico. Qualquer implementação, portanto, permite o mesmo limite de endereço físico do modo longo. Acesso a dados relativos ao ponteiro de instrução As instruções podem agora referenciar os dados relativos ao ponteiro de instrução (registrador RIP). Isto torna o código independente de posição, como é usado frequentemente em bibliotecas compartilhadas e em código carregado no tempo de execução, mais eficiente. Instruções SSE A arquitetura AMD64 original adotou da Intel as instruções SSE e SSE2 como instruções básicas. As instruções SSE3 foram adicionadas em abril de 2005. O SSE2 substitui o conjunto de instruções de 80 bits do IEEE, com a escolha de matemática de vírgula flutuante de 32 bits ou 64 bits do IEEE. Isto fornece as operações de vírgula flutuante compatíveis com muitos outros processadores centrais modernos. As instruções SSE e SSE2 foram estendidas igualmente para operar sobre os oito registradores novos do MMX. SSE e SSE2 estão disponíveis no modo de 32 bits nos processadores x86 modernos; entretanto, se são usados em programas de 32 bits, esses programas funcionarão somente em sistemas com processadores que os suportem. Este não é um problema em programas de 64 bits, porque todos os processadores AMD64 têm SSE e SSE2, portanto, usar as instruções SSE e SSE2 em vez das instruções x87 não reduz o conjunto de máquinas em que os programas x64 podem ser exexutados. Como SSE e SSE2 são geralmente mais rápidos e duplicam a maioria das características das tradicionais instruções x87, MMX, e 3DNow!, estas últimas são redundantes sob AMD64. Bit no-execute O bit "NX" (63º bit da entrada da tabela de páginas) permite que o sistema operacional especifique quais páginas no espaço de endereçamento virtual podem conter códigos executáveis e quais não podem. Uma tentativa para executar código a partir de uma página etiquetada com "não executar" irá resultar em uma violação de acesso à memória, semelhante a uma tentativa de escrever para uma memória somente leitura. Isto deve tornar mais difícil, para um código malicioso, assumir o controle do sistema através de ataques de "estouro de buffer" ou "buffer não checado". A mesma funcionalidade está disponível em processadores x86 desde o 80286 como um atributo dos descritores de segmento; no entanto, isso só funciona em um segmento inteiro de uma vez. O endereçamento segmentado há muito tempo é considerado um modo obsoleto de funcionamento, e todos os sistemas operacionais nos PC atuais burlam isso, configurando todos os segmentos para um endereço base de 0 e um tamanho de 4 GB (4.294.967.296 bytes). A AMD foi a primeira fornecedora da família x86 a implementar o no-execute no modo de endereçamento linear. O recurso também está disponível no modo legado nos processadores AMD64, e nos processadores Intel x86 recentes, quando o PAE é utilizado. Remoção das características mais velhas Uma série de características de "programação de sistemas" da arquitectura x86 não são utilizadas nos sistemas operativos modernos e não estão disponíveis em AMD64 em modo longo (64-bit e compatibilidade). Estes incluem endereçamento segmentado (embora segmentos FS e GS são mantidos em forma vestigial, para compatibilidade com código do Windows), o mecanismo de mudança de estado de tarefa e modo 8086 virtual. Esses recursos, é claro, permanecem totalmente implementados no "modo legado", permitindo assim que esses processadores executem sistemas operacionais de 32 bits e 16 bits sem modificação. Se, em algum momento no futuro, o código de 32 bits e 16 bits com essas características não for mais usado, o suporte para elas poderá ser removido do hardware para simplificar o design do processador e economizar custos de fabricação. Esses recursos podem ser emulados no sistema operacional para preservar a compatibilidade de aplicativos legados, como no DOSBox e emuladores semelhantes.
Detalhes do espaço de endereço virtual Endereços de forma canônica
Embora os endereços virtuais tenham 64 bits de largura no modo de 64 bits, as implementações actuais (e quaisquer chips conhecidos por estarem nos estágios de planeamento) não permitem que todo o espaço de endereço virtual de 16 EB (18.446.744.073.709.551.616 bytes) seja utilizado. A maioria dos sistemas operativos e aplicações não necessitará de um espaço de endereços tão grande para o futuro previsível (por exemplo, as implementações do Windows para AMD64 são apenas a povoar 16 TB (17.592.186.044.416 bytes), ou 44 bits), pelo que suportar endereços virtuais tão amplos iria simplesmente aumentar a complexidade e o custo da tradução de endereços sem qualquer benefício real. A AMD, por isso, decidiu que, nas primeiras implementações da arquitectura, apenas os 48 bits menos significativos de um endereço virtual seriam efectivamente utilizados na tradução de endereços (índice de tabela de páginas).