Intel Microcode - Intel Microcode
Microcódigo Intel é um microcódigo que roda dentro de processadores x86 fabricados pela Intel . Desde a microarquitetura P6 introduzida em meados da década de 1990, os programas de microcódigo podem ser corrigidos pelo sistema operacional ou firmware do BIOS para contornar bugs encontrados na CPU após o lançamento. A Intel projetou originalmente atualizações de microcódigo para depuração de processador sob sua iniciativa de design for testing (DFT).
Seguindo o bug do Pentium FDIV, a função de microcódigo corrigível assumiu um propósito mais amplo para permitir a atualização em campo sem a necessidade de fazer um recall do produto .
No P6 e microarquiteturas posteriores, x86 instruções são convertidos internamente em simples RISC -style micro-operações que são específicos para um processador específico e nível de pisar .
Micro-operações
No Intel 80486 e no AMD Am486 existem aproximadamente 250 linhas de microcódigo, totalizando 12.032 bits armazenados na ROM do microcódigo.
No Pentium Pro, cada microoperação tem 72 bits ou 118 bits. Isso inclui um opcode, dois campos de origem e um campo de destino, com a capacidade de conter um valor imediato de 32 bits. O Pentium Pro é capaz de detectar erros de paridade em seu microcódigo ROM interno e relatá-los por meio da Arquitetura de verificação de máquina .
As microoperações têm um formato consistente com até três entradas de origem e duas saídas de destino. O processador realiza a renomeação de registro para mapear essas entradas de e para o arquivo de registro real (RRF) antes e depois de sua execução. A execução fora de ordem é usada, portanto, as microoperações e instruções que elas representam podem não aparecer na mesma ordem.
Durante o desenvolvimento do Pentium Pro, várias correções de microcódigo foram incluídas entre as revisões A2 e B0. Para o Pentium II (baseado no P6 Pentium Pro), microoperações adicionais foram adicionadas para dar suporte ao conjunto de instruções MMX . Em vários casos, "assistências de microcódigo" foram adicionadas para lidar com casos raros de uma forma confiável.
O Pentium 4 pode ter 126 micro-operações em vôo ao mesmo tempo. As microoperações são decodificadas e armazenadas em um cache de rastreamento de execução com 12.000 entradas, para evitar a decodificação repetida das mesmas instruções x86. Grupos de seis microoperações são agrupados em uma linha de rastreamento. As microoperações podem pedir espaço extra imediato para dados dentro da mesma linha de cache. Instruções complexas, como tratamento de exceções, resultam no salto para a ROM do microcódigo. Durante o desenvolvimento do Pentium 4, o microcódigo foi responsável por 14% dos bugs do processador contra 30% dos bugs do processador durante o desenvolvimento do Pentium Pro.
A microarquitetura Intel Core introduzida em 2006 adicionou " fusão de micro-operações " para alguns pares comuns de instruções, incluindo comparação seguida de um salto. Os decodificadores de instrução no Core convertem instruções x86 em microcódigo de três maneiras diferentes:
| instruções x86 | decodificadores x86 | micro-operações |
|---|---|---|
| comum | decodificador simples × 3 | 1-3 |
| a maioria dos outros | decodificador complexo × 1 | ≤4 |
| muito complexo | sequenciador de microcódigo | muitos |
Para a implementação de hyper-threading da Intel de multithreading simultâneo , a ROM do microcódigo, o cache de rastreamento e os decodificadores de instruções são compartilhados, mas a fila de microoperações não é compartilhada.
Instalação de atualização
Em meados da década de 1990, uma instalação para fornecer um novo microcódigo foi inicialmente chamada de recurso de atualização do BIOS do Pentium Pro . Pretendia-se que os aplicativos de modo de usuário fizessem uma chamada de interrupção do BIOS para fornecer um novo "BIOS Update Data Block", que o BIOS validaria parcialmente e salvaria na memória BIOS não volátil ; isso pode ser fornecido aos processadores instalados na próxima inicialização.
A Intel distribuiu um programa chamado BUP_UTIL.EXE, renomeado, CHECKUP3.EXEque pode ser executado no DOS . Coleções de várias atualizações de microcódigo foram concatenadas juntas e numericamente numeradas com a extensão .PDB, como PEP6.PDB.
Interface do processador
O processador inicializa usando um conjunto de microcódigo mantido dentro do processador e armazenado em uma ROM interna . Uma atualização de microcódigo preenche uma SRAM separada e um conjunto de "registradores de correspondência" que atuam como pontos de interrupção dentro da ROM do microcódigo, para permitir o salto para a lista atualizada de microoperações na SRAM. Uma correspondência é realizada entre o Microcode Instruction Pointer (UIP) e todos os registros de correspondência, com qualquer correspondência resultando em um salto para o endereço do microcódigo de destino correspondente. Na arquitetura P6 original, há espaço na SRAM para 60 microoperações e vários pares de registros de correspondência / destino. É necessário um ciclo de instrução do processador para saltar do microcódigo ROM para o microcódigo corrigido mantido na SRAM. Os registros de correspondência consistem em um endereço de correspondência de microcódigo e um endereço de destino de microcódigo.
O processador deve estar no anel de proteção zero (" Ring 0 ") para iniciar uma atualização do microcódigo. Cada CPU em um arranjo de multiprocessamento simétrico precisa ser atualizada individualmente.
Uma atualização é iniciada colocando seu endereço no eaxregistro, configurando ecx = 0x79e executando um wrmsr( registro específico do modelo de gravação ).
Formato de atualização do microcódigo
A Intel distribui atualizações de microcódigo como um blob binário de 2.048 (2 kilobytes) . A atualização contém informações sobre os processadores para os quais foi projetada, de forma que isso possa ser verificado em relação ao resultado da instrução CPUID . A estrutura é um cabeçalho de 48 bytes, seguido por 2.000 bytes destinados a serem lidos diretamente pelo processador para serem atualizados:
- Um programa de microcódigo que é executado pelo processador durante o processo de atualização do microcódigo. Este microcódigo é capaz de reconfigurar e habilitar ou desabilitar componentes usando um registro especial, e deve atualizar os registros de correspondência do ponto de interrupção.
- Até sessenta micro-operações corrigidas a serem preenchidas na SRAM.
- Preenchimento que consiste em valores aleatórios, para ofuscar a compreensão do formato da atualização do microcódigo.
Cada bloco é codificado de forma diferente e a maioria dos 2.000 bytes não são usados como programa de configuração e os próprios conteúdos de microoperação SRAM são muito menores. A determinação final e a validação de se uma atualização pode ser aplicada a um processador são realizadas durante a descriptografia por meio do processador. Cada atualização de microcódigo é específica para uma revisão de CPU em particular e é projetada para ser rejeitada por CPUs com um nível de revisão diferente . As atualizações do microcódigo são criptografadas para evitar adulteração e para permitir a validação.
Com o Pentium, existem duas camadas de criptografia e os detalhes precisos não documentados explicitamente pela Intel, sendo conhecidos apenas por menos de dez funcionários.
As atualizações de microcódigo para Intel Atom , Nehalem e Sandy Bridge contêm adicionalmente um cabeçalho de 520 bytes extra contendo um módulo RSA de 2048 bits com um expoente de 17 decimais.
| Microarquitetura | Processadores de exemplo | Comprimento fornecido | Comprimento funcional | Codificação suspeita |
|---|---|---|---|---|
| P6 | Pentium Pro | 2000 | 864; 872; 944; 1968 | Cifra de bloco de 64 bits |
| Essencial | PIII ... Core 2 | 4048 | 3096 | |
| Netburst | P4 , Pentium D , Celeron | 2000–7120 | 2000 + N * 1024 | cifra de bloco em cadeia |
| Atom, Nehalem, Sandy Bridge | Core i3 / i5 / i7 | 976-16336 | 976 + N * 1024; 5120 | Assinatura AES + RSA |
Depurando
Um microcódigo específico para depuração especial pode ser carregado para habilitar o Extended Execution Trace, que então produz informações extras por meio dos pinos do monitor de ponto de interrupção. No Pentium 4, o carregamento do microcódigo especial pode dar acesso ao modo Microcode Extended Execution Trace. Ao usar a porta de acesso de teste JTAG (TAP), um par de registros de controle de ponto de interrupção permite interromper os endereços de microcódigo.
Em meados da década de 1980, a NEC e a Intel tiveram um caso de longa data no tribunal federal dos Estados Unidos sobre direitos autorais de microcódigo. A NEC tem atuado como uma segunda fonte para CPUs Intel 8086 com seu NEC μPD8086 e mantém contratos de licenciamento cruzado de patentes e direitos autorais de longo prazo com a Intel. Em agosto de 1982, a Intel processou a NEC por violação de direitos autorais sobre a implementação do microcódigo. A NEC prevaleceu ao demonstrar, por meio da engenharia de software de sala limpa, que as semelhanças na implementação do microcódigo em seus processadores V20 e V30 eram o resultado das restrições exigidas pela arquitetura, e não via cópia.
O Intel 386 pode realizar um autoteste integrado do microcódigo e das matrizes lógicas programáveis , com o valor do autoteste colocado no EAXregistrador. Durante o BIST, o contador do microprograma é reutilizado para percorrer todos os ROMs, com os resultados sendo agrupados por meio de uma rede de registros de assinatura de entrada múltipla (MISRs) e registros de deslocamento de feedback linear. Na inicialização do Intel 486 , um BIST controlado por hardware é executado por 2 a 20 ciclos de clock para verificar várias matrizes, incluindo o microcódigo ROM, após o que o controle é transferido para o microcódigo para autoteste adicional de registros e unidades de computação. O microcódigo Intel 486 ROM tem 250.000 transistores.
A AMD tinha um contrato de longo prazo para reutilizar os microcódigos 286, 386 e 486 da Intel. Em outubro de 2004, um tribunal decidiu que o acordo não cobria a distribuição do microcódigo de emulação em circuito (ICE) 486 da Intel .
Teste de acesso direto
O Teste de Acesso Direto (DAT) está incluído nas CPUs da Intel como parte das iniciativas de design para teste (DFT) e Design para Depuração (DFD) que permitem o teste de cobertura total de CPUs individuais antes da venda.
Em maio de 2020, um script lendo diretamente do Control Register Bus (CRBUS) (após explorar "Red Unlock" em JTAG USB-A para USB-A 3.0 com capacidades de depuração, sem D +, D- e Vcc) foi usado para ler de a porta de teste de acesso direto local (LDAT) da CPU Intel Goldmont e o microcódigo carregado e matrizes de patch foram lidos. Essas matrizes só são acessíveis após a CPU ter sido colocada em um modo específico e consistem em cinco matrizes acessadas por meio do deslocamento 0x6a0:
- ROM: tríades de microcódigo
- ROM: Palavras de Sequência
- RAM: Sequência de Palavras (atualizável)
- RAM: pares Match / Patch (atualizável)
- RAM: tríades de microcódigo (atualizável)
Referências
Leitura adicional
- Patente US 5404473 , Papworth, David B .; Fetterman, Michael A. & Glew, Andrew F. et al., "Aparelho e método para lidar com operações de string em um processador em pipeline", publicado em 04/04/1995, atribuído à Intel "o primeiro Cuops em uma operação de swing REP carrega o MS Loop Counter com o número de iterações restantes após as iterações desenroladas serem executadas. ... um pequeno número de iterações (por exemplo, sete), é enviado durante o tempo que leva para o Contador de Loop no MS ser carregado. Este código desenrolado é executado condicionalmente com base no valor de (E) CX ... as três iterações restantes são transformadas em NOPS . "
- Patente US 5559974 , Boggs, Darrell D .; Brown, Gary L. & Hancock, Michael M. et al., "Decoder tendo registros de micro-alias e macro-alias independentemente carregados acessíveis simultaneamente por uma micro-operação", publicado 1996-09-24, atribuído à Intel
- Patente US 5566298 , Boggs, Darrell D .; Brown, Gary L. & Hancock, Michael M. et al., "Método para recuperação de estado durante assistência e reinicialização em um decodificador com um mecanismo de alias", publicado em 1996-10-15, atribuído à Intel "... o controle retorna ao Micro - unidade de Sequência de operação (MS) para emitir mais microoperações de controle de correção de erro (Cuops). A fim de simplificar a reinicialização, os Cuops originados da macroinstrução causadora de erro fornecida pelas matrizes lógicas programáveis de tradução (XLAT PLAs) são carregados no Cuop registra, com seus bits válidos não declarados. "
- Patente US 5600806 , Brown, Gary L. & Parker, Donald D., "Método e aparelho para alinhar um limite de instrução em macroinstruções de comprimento variável com um buffer de instrução", publicado em 04/02/1997, atribuído à Intel "ADD, XOR, SUB, AND e OR, que são implementados com um Cuop genérico. Outro grupo de instruções representável por apenas um Cuop inclui ADC e SBB
- Patente US 5630083 , Carbine, Adrian L .; Brown, Gary L. & Parker, Donald D., "Decoder for decoding multiple Instructions in parallel", publicado em 01/03/2013, atribuído à Intel
- Patente US 6055656 , Wilson, Jr., James A .; Miller, Anthony C. & Rhodehamel, Michael W. et al., "Control register bus access through a standardized test access port", publicado em 25/04/2000, atribuído à Intel
- Patente US 20030196096 , Sutton, James A., "Microcode patch authentication", publicado em 16/10/2003
- Patente dos EUA 5948097 , Glew, Andrew & Rodgers, Scott Dion, "Método e aparelho para alterar os níveis de privilégio em um sistema de computador sem o uso de uma porta de chamada", publicada em 07/09/1999, atribuída à Intel "SYSENTER e SYSEXIT são assembly- instruções de linguagem que podem ser executadas em um processador de arquitetura Intel, como o processador Pentium Pro ... a microoperação está determinada a estar pronta quando seus campos de origem foram preenchidos com os dados apropriados ... a unidade de decodificação de instrução compreende um ou mais traduções (XLAT) programáveis matrizes lógicas (PLAs) que decodificam cada instrução em uma ou mais microoperações. ... As instruções SYSENTER e SYSEXIT são decodificadas em microoperações que realizam as etapas ilustradas nas FIGS. 5 e 6, respectivamente. "
-
"Microcode Updater interface sysctl" (
ucode.cdriver) . XNU . Página visitada em 24 de janeiro de 2018 .#define IA32_BIOS_UPDT_TRIG (0x79) /* microcode update trigger MSR */ - Sivaram, AT; Fan, Daniel; Yiin, A. (2002-10-10). Teste Eficiente de Memória Embutida com APG . 1 . Baltimore, Maryland: IEEE. doi : 10.1109 / TEST.2002.1041744 . ISBN 0-7803-7542-4. ISSN 1089-3539 . S2CID 19579807 .
-
Bosch, Peter (2020-10-01). "Sob o capô de uma CPU: Engenharia reversa do microcódigo P6" . Holanda . Obtido em 2020-11-01 . Citar diário requer
|journal=( ajuda )
links externos
uCodeDisasm - desmontador de microcódigo Intel em Python (de CRBUS), nomes de uops