



Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
A ISA (instruction set architecture) x86-64, também con- hecido como AMD64, EMT64 e x64 consiste de uma ex- tens˜ao e limpeza da ISA IA32, introduzida pela ...
Tipologia: Notas de aula
1 / 6
Esta página não é visível na pré-visualização
Não perca as partes importantes!
O prop´osito desse artigo ´e oferecer uma vis˜ao geral das mu- dan¸cas introduzidas pela ISA x86-64, utilizado nos proces- sadores Athlon 64 e Pentium 4 com EMT64. Entre as mu- dan¸cas nessa arquitetura est˜ao altera¸c˜oes no n´umero de reg- istradores, que passa a ser 16 registradores de uso geral. Al´em disso, o n´umero de registradores XMM (utilizados em instru¸c˜oes SSE) tamb´em aumentou de 8 para 16. Os reg- istradores de uso geral passam a ter um comprimento de 64 bits. O mecanismo de endere¸camento tamb´em mudou, permitindo um espa¸co de endere¸camento de 64 bits, plano (sem a segmenta¸c˜ao presente na ISA x86). Al´em disso, agora ´e poss´ıvel endere¸car a mem´oria a partir do RIP (ponteiro de instru¸c˜ao). Outra mudan¸ca que vale mencionar foi a ado¸c˜ao das instru¸c˜oes SSE e SSE2 como padr˜ao na arquite- tura, na pr´atica tornando outros mecanismos de ponto flutu- ante (MMX, x87 FPU, 3DNow!) obsoletos, e aproximando o tratamento de ponto flutuante ao encontrado em arquite- turas RISC.
A ISA (instruction set architecture) x86-64, tamb´em con- hecido como AMD64, EMT64 e x64 consiste de uma ex- tens˜ao e limpeza da ISA IA32, introduzida pela Intel com o processador 386. Como o pr´oprio nome indica, ele foi ex- pandido para trabalhar com dados de 64 bits de largura e endere¸car 64 bits de mem´oria (embora implementa¸c˜oes at- uais do processador sejam mais limitadas que isso). Al´em disso, o n´umero de registradores foi aumentado: antes eram 8 registradores de uso geral (GPR) e 8 pra instru¸c˜oes Stream- ing SIMD (XMM). Agora s˜ao 16 registradores de uso geral e 16 XMM.
Mas al´em dessa expans˜ao foram feitas v´arias limpezas de modo a remover v´arias das idiossincrasias presentes na ISA IA32; contanto, devido `a necessidade de se manter a com- patibilidade essas mudan¸cas apenas est˜ao presentes quando o processador opera em modo 64 bits.
Dentre essas mudan¸cas est´a o modelo de mem´oria “achatado”^1. Esse foi implementado devido ao fato de que a maior parte da segmenta¸c˜ao do espa¸co de endere¸camento em sistemas modernos ´e feito em software, pelo sistema operacional. Ent˜ao a mem´oria ´e acessada como um bloco cont´ınuo de 64 bits, ao contr´ario do que havia nos processadores anteriores, em que se mantinha um apontador para segmentos de c´odigo e dados.
Outra altera¸c˜ao importante ´e que instru¸c˜oes das fam´ılias SSE (Streaming SIMD Extensions 1/2/3) foram inclusas na especifica¸c˜ao do processador; devido a esse fato a Microsoft, no Windows XP x86-64 d´a preferˆencia `as instru¸c˜oes SSE so- bre as instru¸c˜oes de outras extens˜oes, como MMX, 3dNow! e o pr´oprio FPU x87. O sistema operacional simplesmente n˜ao salva os dados contidos nesses registradores em mudan¸cas de contexto.
Al´em disso, a arquitetura do x86-64 especifica o bit NX (No eXecute) como um mecanismo para prevenir erros de buffer overflow. Consiste de um bit na tabela de p´aginas que especifica se os dados em dada tabela podem ou n˜ao serem executados.
Um coment´ario: esse artigo n˜ao vai tratar de mudan¸cas no hardware em si, e sim focar no conjunto de instru¸c˜oes e arquitetura associada desenvolvida pela AMD e depois ado- tada pela Intel, a ISA x86-64. Portanto detalhes como o gerenciamento de mem´oria embutida do Athlon 64 ou o au- mento do n´umero de est´agios de pipeline adotados nessa implementa¸c˜ao n˜ao receber˜ao aten¸c˜ao.
A arquitetura provˆe dois modos principais de execu¸c˜ao: Long mode e modo legado. O long mode ´e o modo de execu¸c˜ao pretendido para o processador; ´e nele que executa o c´odigo de 64 bits. Esse modo tem dois submodos: modo de com- patibilidade, no qual c´odigo de 32 bits pode ser executado sem nenhuma perda de desempenho, e modo 64 bits, no qual executa c´odigo de 64 bits, como o pr´oprio nome indica. Vale notar que os outros modos de execu¸c˜ao (modo virtual e real) n˜ao s˜ao modos v´alidos, enquanto o processador est´a em long mode — apenas c´odigo do modo protegido pode ser executado no modo de compatibilidade.
O outro modo de execu¸c˜ao ´e o modo legado; ele executa como um processador x86, inclusive permitindo executar (^1) Flat., em inglˆes
c´odigo em modo virtual e real.
Referimos a [2] para detalhes de como cada modo de ex- ecu¸c˜ao ´e acionado. A tabela 2 ilustra os diferentes modos.
Quase todas as mudan¸cas mencionadas nesse artigo se ref- erem ao modo 64 bits, uma vez que os outros modos s˜ao idˆenticos, no n´ıvel da ISA, aos modos presentes nos proces- sadores x86-32. Os long mode pode ser acessado apenas por um sistema operacional de 64 bits, enquanto que o modo legado ´e pretendido para sistemas operacionais mais antigos e programas que precisam executar em 8 ou 16 bits.
Table 1: Modos de opera¸c˜ao do x86- Modo de opera¸c˜ao Sistema operacional Endere¸camento Operando Padr˜ao Modo Submodo Long 64-bit 64-bit 64-bit 32-bit Long Compatibilidade 64-bit 32/16-bit 32/16-bits Legado Protegido 32-bit 32/16-bit 32/16-bit Legado Virtual 32-bit 16-bit 16-bit Legado Real 16-bit 16-bit 16-bit
Em modo de 64 bits a ISA x86-64 introduz 16 novos reg- istradores: 8 GPRs, que deixam o n´umero total de GPRs presentes no processador em 16. Os outros 8 registradores s˜ao registradores XMM, reservados para instru¸c˜oes Stream- ing SIMD, tamb´em conhecidos como SSE/SSE2/SSE3. Esse aumento de registradores ajuda a atenuar a falta de reg- istradores presentes na arquitetura x86-32, apesar de que ainda s˜ao significativamente menos registradores do que se encontra em muitas m´aquinas RISC (o MIPS, por exemplo, tem 32).
A extens˜ao dos registradores est´a exibido na figura 1, re- tirado do AMD64 Architecture Programmer’s Manual, Vol- ume 1. Os registradores de uso geral de 32 bits, de EAX a ESP foram aumentados, e seus nomes, quando acessados em 64 bits v˜ao de RAX a RSP. Al´em disso, foram acrescentados novos registradores, que tem nomes de R8 a R15.
Como a figura indica, registradores de tamanho menor (por exemplo, AX para os 16 bits menos significativos de EAX e AL para os 8 bits menos significativos de EAX) podem ser acessados da mesma maneira que eram na arquitetura de 32 bits. Existe uma diferen¸ca, por´em, que ´e o prefixo REX.
O prefixo REX permite um acesso mais consistente aos reg- istradores. Ele informa ao processador qual ser´a o tamanho do operando de uma instru¸c˜ao: se n˜ao for utilizado, os mecanismos de acesso presentes na arquitetura de 32 bits s˜ao utilizados, com a diferen¸ca de que os registradores de 64 bits (Rxx) podem ser acessados. O problema desse m´etodo ´e que ele n˜ao ´e consistente. Apenas os registradores AX, BX, CX e DX podem ter os seus 8 bits mais e menos significativos acessados. Utilizando os prefixos REX podemos acessar os 8, 16, 32 ou 64 bits menos significativos de qualquer proces- sador. Perdemos a habilidade de acessar os registradores AH a DH, mas em troca o mecanismo se torna mais consistente — o que pode ser muito importante para o desenvolvimento de um compilador eficiente.
Vale notar que na maioria dos casos as instru¸c˜oes tem 32 bits de largura, como padr˜ao. Para efetuar opera¸c˜oes sobre os registradores de 64 bits de largura ´e necess´ario utilizar um
Figure 1: Os registradores presentes na arquitetura de 64 bits
prefixo REX. Vamos ver outros detalhes sobre os prefixos REX na subse¸c˜ao 5.1, quando tratarmos dos formatos de instru¸c˜ao utilizados pelo x86-64.
Como mencionado anteriormente, no modo 64-bits o mod- elo de endere¸camento ´e “achatado”. A mem´oria virtual ´e vista como um bloco sem quebras de 64 bits, que ´e ma- peada para o n´umero correspondente de bits da mem´oria real. No momento da escrita desse artigo, a mem´oria real tinha 52 bits. O mecanismo de segmenta¸c˜ao est´a ilustrado na figura 2. Embora os registradores de segmento ainda existem no modo 64-bits, o endere¸co contido nos mesmos ´e tratado como sendo 0 na maioria dos casos pra efeito de c´alculo de endere¸camento.
A raz˜ao dessa mudan¸ca ´e que em sistemas operacionais mod- ernos o espa¸co de endere¸camento j´a ´e visto como um bloco cont´ıguo achatado e a segmenta¸c˜ao ´e desempenhada total- mente em software. Isso permite que sistemas operacionais de 64 bits sejam codificados de uma maneira mais simples, e permite um manejamento mais simples de um ambiente multiprogramado do que era poss´ıvel na arquitetura x86-32.
Embora o espa¸co de endere¸camento ´e visto como um bloco cont´ıguo, algumas caracter´ısticas de segmenta¸c˜ao do x86- ainda persistem. Ainda s˜ao utilizados segmentos de c´odigo
Figure 4: C´alculo de endere¸co complexo.
Instru¸c˜oes que cont´em endere¸cos de 32 e 16 bits e est˜ao sendo executados em long mode s˜ao expandidos para endere¸cos de 64 bits da seguinte forma: os valores s˜ao truncados para o n´umero correto de bits (32 ou 16) e ent˜ao s˜ao extendidos com 0s at´e completar os 64 bits. Dessa forma, um aplicativo de 16 ou 32 bits executando em modo de compatiblidade pode apenas acessar os 4 Gigabytes mais baixos do espa¸co de 64 bits. Da mesma forma, um endere¸co de 32 bits gerado em modo 64-bits pode apenas acessar os 4 Gigabytes mais baixos.
Al´em disso, o maior valor para um imediato ou desloca- mento na arquitetura de 64 bits ´e de 32 bits. Dependendo da instru¸c˜ao e do endere¸camento, um imediato ou desloca- mento pode ter 8, 16 ou 32 bits. No modo de 64-bits deslo- camentos s˜ao extendidos para 64-bits, como mencionado acima. Por´em para efeito de representa¸c˜ao o m´aximo con- tinua sendo 32 bits. O mesmo vale para instru¸c˜oes imedi- atas. Contanto, existem algumas exce¸c˜oes: alguns formatos da instru¸c˜ao MOV podem acessar mais do que 32 bits.
A arquitetura x86-64 adota, na grande maioria, todas as in- stru¸c˜oes presentes na arquitetura de 32 bits, com extens˜oes que permitem acesso a operandos e endere¸cos de mem´oria de 64 bits, como seria de se esperar. Contanto, algumas in- stru¸c˜oes que fazem parte da ISA x86-32 n˜ao fazem parte da arquitetura de 64 bits. Em particular, as instru¸c˜oes mais idiosincr´aticas n˜ao fazem mais parte da arquitetura, como por exemplo as instru¸c˜oes que lidam com valores BCD (Binary-coded Decimal) ou valores ASCII. Al´em disso, in- stru¸c˜oes de jump ou branch “longes” de maneira direta n˜ao s˜ao mais instru¸c˜oes v´alidas. Instru¸c˜oes que inserem ou re- movem os registradores de segmento da pilha tamb´em pas- sam a n˜ao ser mais v´alidos. As instru¸c˜oes para chamadas de sistema tamb´em mudou: as instru¸c˜oes SYSENTER e SY- SEXIT n˜ao s˜ao mais v´alidas: SYSCALL e SYSRET devem ser usadas no seu lugar.
Como mencionado anteriormente, instru¸c˜oes utilizam operan- dos de 32 bits como padr˜ao, esse comportamento podendo ser alterado pela utiliza¸c˜ao de um prefixo REX. J´a algumas instru¸c˜oes n˜ao precisam de um prefixo REX para operar sobre valores de 64 bits. Instru¸c˜oes de branch em particu- lar operam automaticamente com valores de 64 bits; como
dito na se¸c˜ao anterior, o valor m´aximo para um imediato ´e de 32 bits, portanto para acessar posi¸c˜oes mais distantes ´e necess´ario fazer um acesso indireto – atrav´es de uma posi¸c˜ao em mem´oria.
N˜ao vamos entrar em detalhes quanto `as instru¸c˜oes alter- adas por quest˜oes de espa¸co. Referimos ao manual de pro- grama¸c˜ao de aplicativos[1] e ao manual de instru¸c˜oes de uso geral e de sistema[3] para mais detalhes.
Como indicado na figura 1 opera¸c˜oes feitas sobre valores de 32 bits s˜ao extendidos para 0; ou seja, os 32 bits mais significativos dos registradores recebem o valor 0. Isso ´e diferente do que acontece com instru¸c˜oes que manipulam os registradores de 8 ou 16 bits. Nesses casos, os bits mais signi- ficativos n˜ao s˜ao alterados pela instru¸c˜ao. Isso ´e consistente com a opera¸c˜ao em 32 bits, na qual manipula¸c˜ao dos reg- istradores de 8 e 16 bits n˜ao alterava o resto do registrador. Vale notar, inclusive, que os 32 bits mais significativos n˜ao s˜ao preservados durante mudan¸cas de contexto, para modo de compatibilidade ou legado.
Como na arquitetura de 32 bits, v´arios dos registradores tem fun¸c˜oes impl´ıcitas. Por exemplo, durante multiplica¸c˜ao e divis˜ao os registradores RAX e RDX s˜ao utilizados jun- tos como operandos ou para armazenar os valores resul- tantes. O registrador RCX ´e utilizado em opera¸c˜oes de la¸co e os registradores RBP e RSP s˜ao os registradores de pilha. Isso apesar de que os registradores s˜ao supostamente de uso geral. N˜ao vamos mencionar cada um dos usos impl´ıcitos de registradores; inv´es disso referimos `a [1].
O registrador EFLAGS, utilizado na arquitetura de 32 bits foi ampliado para o registrador RFLAGS, apesar de que a arquitetura x86-64 n˜ao adicionou nenhum flag novo. Os 32 bits mais significantes de RFLAGS no momento est˜ao reservados, e o sistema garante que qualquer leitura deles, no momento, retornar´a 0. Novamente, n˜ao iremos entrar em detalhes e referimos a [1, 4].
A arquitetura oferece duas instru¸c˜oes para chamada de c´odigo privilegiado: SYSCALL e SYSRET. As instru¸c˜oes con- tam com o fato de que o espa¸co de endere¸camento vai ser plano, e dispensam v´arias checagens adicionais, al´em de car- regarem valores pr´e-determinados nos segmentos apropria- dos, como endere¸cos das chamadas. Essas chamadas con- seguem executar em um quarto dos ciclos que levariam as instru¸c˜oes CALL e RET. As instru¸c˜oes SYSENTER e SYSEXIT tamb´em executam com baixa latˆencia, mas s˜ao opera¸c˜oes proibidas em modo de 64 bits.
O formato da instru¸c˜ao na arquitetura x86-64 ´e o mesmo da arquitetura de 32 bits: instru¸c˜oes podem ter de 1 a 15 bytes, com um prefixo de at´e 4 bytes, um opcode de at´e 3 bytes, seguido pelo byte ModR/M, o byte SIB, o deslocamento de at´e 4 bytes e um valor imediato, tamb´em de 4 bytes. Todas os argumentos s˜ao opcionais, com exce¸c˜ao do opcode. O arranjo da instru¸c˜ao pode ser visto na figura 5[5].
Mesmo em modo 64-bits, sem um prefixo REX a maioria das instru¸c˜oes n˜ao pode acessar mais do que os 8 registradores da arquitetura x86-32, e n˜ao consegue acessar dados com
Figure 5: Formato de instru¸c˜ao na arquitetura x86-
largura maior que 32 bits. Em contrapartida, como men- cionado anteriormente, sem o bit REX ´e poss´ıvel acessar os bytes altos dos registradores AX a DX.
O prefixo REX tem o prop´osito de permitir n˜ao apenas que 16 registradores de uso geral sejam acessados, mas que seus operandos tenham 16 bits. Como dito anteriormente ele garante que todos os registradores possam ser acessados de maneira uniforme, a um pequeno custo de flexibilidade. Em- bora n˜ao ´e poss´ıvel acessar os bytes altos dos registradores AX a DX, ´e poss´ıvel acessar os bytes baixos de cada um dos registradores de uso geral, o que antes n˜ao era poss´ıvel. A especifica¸c˜ao de acesso de registradores menores que 64 bits ´e idˆentico ao da arquitetura x86-32.
Na tabela 5.1 vemos os bits do prefixo REX, e na figura 6 vemos exemplos do uso do prefixo no endere¸camento de instru¸c˜oes, retirados de [3]. Referimos a esse texto para mais detalhes.
A arquitetura x86-64 oferece trˆes maneiras de operar so- bre dados de ponto flutuante. Uma pelas instru¸c˜oes SSE (Streaming SIMD^3 Extension), pelas instru¸c˜oes multim´ıdia de 64 bits (3dNow!, MMX) e pelas instru¸c˜oes de ponto flutu- ante x87. Embora a funcionalidade seja replicada, a pr´opria descri¸c˜ao da arquitetura recomenda que as instru¸c˜oes SSE
(^3) Single Instruction Multiple Data
Mnemˆonico Posi¸c˜ao Defini¸c˜ao
Table 2: Os bits do prefixo REX.
Figure 6: Exemplos do uso do prefixo REX em modo 64-bits.