O que exatamente é um microcódigo e como ele difere do firmware?

50

Na terminologia, o que exatamente é "microcódigo" e se pode ser atualizado, como difere do firmware?

Esta pergunta não é uma duplicata desta pergunta (pelo que sei), que eu também perguntei sobre a modificação do microcódigo. Aqui, estou estritamente querendo saber como usar esses termos corretamente.

Atualizar

Eu tenho uma resposta selecionada, mas não estou particularmente satisfeito com ela. Eu envolvi muitas respostas e considero muitas delas igualmente insatisfatórias. Então, deixe-me apresentar meus dois quadros,

  1. "O microcódigo do processador é semelhante ao firmware do processador." Enquanto leio isso cada vez mais, é assim que eu entendo. "Microcódigo" é, neste contexto, apenas marketing sobre "firmware do processador". Tenha paciência comigo ..
  2. Ou, eu estou errado, e eu sei que isso acontece! Nesse caso, preciso de uma idéia muito mais completa do porquê de estar errado. Nas respostas que li para apontar que estou errado, estou lutando para entendê-las,
    • "Execução versus dados" muitas respostas usam esse paradigma, mas para a CPU que não faz muito sentido para mim. Alguns afirmam que o firmware é executado, mas por quê? Quando se trata da CPU, os programas são instruções ou dados?
    • Se o firmware preenche o software e o hardware (leia-se: o material de engenharia elétrica dos Deuses), como o microcódigo também não está satisfazendo essa distinção.
    • "Interpretar" com o passar do tempo, isso faz cada vez menos sentido. O que significa dizer "instruções de hardware são interpretadas" com Microcode. Se isso fosse verdade, algo teria o mesmo desempenho se não fosse interpretado, mas pré-compilado para diferentes instruções de hardware e meramente "executado"? Além disso, como o General MIDI não é interpretado da mesma maneira? É uma linguagem que é interpretada pelo "microcódigo MIDI" e é executada no hardware. Ou terminais burros que interpretam as instruções do teleprinter para exibição visual?
    • O "microcódigo" se aplica ao código executado nas placas de som e nas placas de vídeo (GPUs) ?
Evan Carroll
fonte
Não sou especialista, mas diria que o microcódigo é o firmware do processador. Eu imagino que todos os dados sobre como o microcódigo é executado seriam de propriedade da Intel / AMD, mas posso imaginar como ele funcionaria. Você tem um conjunto simples de CPU, itens básicos, como busca de operadores de memória e matemática. Então você tem um conjunto de instruções complexo (como x86 / intel). A CPU obtém as instruções da memória e usa o microcódigo para converter as instruções complexas em instruções mais simples. Um exemplo seria multiplicação. A maioria das CPUs possui uma instrução de multiplicação, mas na verdade a multiplicação consiste em várias mudanças de bits.
Programmdude
O termo Microcódigo refere-se ao fato de que ele usa / é subjacente a muitas das instruções de “código” da CPU. Basicamente, diz à CPU como emular instruções e recursos. Daí o nome. Do ponto de vista do proprietário de um computador, é mais um conjunto de códigos enviado pelo fornecedor do hardware, para que possa ser resumido como firmware.
Eckes
Na IMO, a melhor resposta simples é: "Cada vez que um processador executa uma instrução, na verdade ele está executando um programa de microcódigo". O que parece ser uma instrução de processador único é uma sequência específica de instruções de microcódigo, um 'programa de microcódigo'. Cada instrução possui seu próprio programa de microcódigo. As instruções individuais do microcódigo ativam / desativam / etc os vários bits internos do processador.
Ethan Reesor

Respostas:

57

A origem da palavra firmware é um ponto intermediário entre hardware e software - software incorporado ao hardware. Refere-se ao software que é armazenado na memória não volátil em um dispositivo de hardware. Exemplos são a EEPROM e a memória Flash incorporada aos dispositivos de hardware, quando usadas para armazenar o código que é executado pelo próprio dispositivo.

Está se tornando mais comum em alguns tipos de hardware seu "firmware" ser armazenado no software do driver e carregado no dispositivo durante a inicialização / inicialização, em vez de deixá-lo permanentemente no dispositivo. Hoje em dia, não é grande coisa, por exemplo, armazenar algumas centenas de KB de código de firmware em um driver de software carregado no sistema operacional host e enviá-lo para o dispositivo, conforme inicializado pelo driver.

Isso ainda é conhecido como "firmware", embora, dependendo da definição de firmware que você aceita, você não considere tecnicamente o firmware porque ele não reside no hardware (se você desconectar o hardware e colocá-lo em outro sistema, ele não reterá a versão do "firmware").

Microcódigo é um subconjunto deste último tipo de "firmware". Microcódigo não é um termo genérico para todo o "firmware" carregado em um dispositivo na inicialização. Em vez disso, é específico para CPUs, onde o microcódigo basicamente forma a camada de conversão entre as instruções padrão de CPU de nível superior e as operações de nível inferior específicas para essa CPU. Ele é carregado na CPU na inicialização, pelo BIOS, mas pode ser substituído posteriormente no estágio de inicialização pelo sistema operacional.

Uma atualização no microcódigo pode permitir que o comportamento de baixo nível da CPU seja modificado para solucionar alguns erros ainda a serem descobertos, sem a necessidade de substituir o hardware da CPU. O microcódigo geralmente contém o mapeamento mais eficiente das instruções de nível mais alto para o mais baixo possível, para obter a melhor velocidade e eficiência de energia. Às vezes, quando uma alteração no microcódigo é necessária para corrigir algum erro, pode resultar em desempenho reduzido.

Observe que o Meltdown (a vulnerabilidade que afeta apenas os chips Intel) não pode ser corrigido apenas com atualizações de microcódigo e requer alterações na funcionalidade principal do sistema operacional, o que pode reduzir ainda mais o desempenho. O Spectre (a vulnerabilidade que afeta os chips Intel, AMD e ARM) pode ser capaz de contornar apenas as atualizações de microcódigo.


Para responder a algumas de suas perguntas específicas desde a sua edição:

  1. Sim, o microcódigo é basicamente o firmware que roda no processador. O termo especial "microcódigo" refere-se especificamente ao firmware em um processador que contém o plano para traduzir da linguagem de máquina padrão para instruções de processador de baixo nível. Portanto, é um termo mais específico que firmware.

    Observe que, como discuti acima, ele não é armazenado na CPU enquanto está desligado, mas carregado toda vez que você inicializa, de certa forma, não funciona como o firmware tradicional. No entanto, muito hardware faz isso agora e ainda é chamado de "firmware", portanto é aceitável chamá-lo de firmware.

  2. Eu não acho que você esteja errado. O firmware não precisa ser escrito em uma determinada linguagem de máquina e sua execução não precisa ser acionada de uma certa maneira. Em um certo nível baixo, todo código de máquina é "dados" que são "lidos" por um processador e interpretados de uma certa maneira.

    O termo "microcódigo" geralmente é usado apenas para CPUs principais e não para placas gráficas ou outro hardware, mesmo que esses outros dispositivos possam ter o código carregado da mesma maneira.

thomasrutter
fonte
11
Sua segunda frase está incorreta; O firmware inclui o software armazenado na ROM. Era uma vez a maioria dos firmware em ROM, antes que as alternativas se tornassem acessíveis.
Harry Johnston,
11
Claramente, "microcódigo" é específico para uma CPU. A questão é diferente de ser específica: ela é diferente? Removendo o escopo ("a CPU"), você obtém uma citação quase direta de "camada de conversão entre instruções de nível superior e operações de nível inferior". Isso é muito bonito apenas a definição de firmware. Não é isso que todo firmware faz? São muitas palavras, mas acho que a descrição mais descritiva e concisa é a acima: "O microcódigo do processador é semelhante ao firmware do processador".
Evan Carroll
@Evan, a maioria dos dispositivos recebe instruções indiretamente, enviadas do código que está sendo executado na CPU. Somente a CPU está processando diretamente o código fornecido pelo usuário. Considere também que a maioria dos dispositivos contém uma CPU incorporada de algum tipo que executa o firmware e que a CPU pode ter seu próprio microcódigo. A distinção pode ser importante apenas para designers de hardware e programadores de kernel, mas não é arbitrária.
Harry Johnston
"a maioria dos dispositivos contém uma CPU incorporada de algum tipo que executa o firmware e essa CPU pode ter seu próprio microcódigo", é o que quero dizer. Então, o código que processa um fluxo midi em uma placa de som também é "microcódigo"? Ou o código que desenha / renderiza caracteres de exibição em um terminal burro?
Evan Carroll
Não. O código que está sendo executado na placa de som para processar um fluxo MIDI é apenas um firmware comum. O código que processa o código que está sendo executado na placa de som para processar um fluxo MIDI seria um microcódigo. (Na prática, não tenho certeza de que a CPU incorporada em algo tão simples quanto uma placa de som precise de microcódigo, mas isso não vem ao caso.) O principal é que um fluxo MIDI ou os caracteres que estão sendo enviados para um terminal burro, não é código. Eles são apenas dados.
Harry Johnston
23

https://wiki.debian.org/Microcode

Microcódigo da CPU

O microcódigo do processador é semelhante ao firmware do processador. O kernel é capaz de atualizar o firmware do processador sem a necessidade de atualizá-lo através de uma atualização do BIOS. Uma atualização de microcódigo é mantida na memória volátil; portanto, o BIOS / UEFI ou o kernel atualiza o microcódigo durante cada inicialização.

Os processadores Intel e AMD podem precisar de atualizações em seu microcódigo para operar corretamente. Essas atualizações corrigem bugs / erratas que podem causar qualquer coisa, desde processamento incorreto até corrupção de código e dados e travamentos do sistema.

O BIOS (ou UEFI) atualiza o microcódigo da CPU durante a inicialização, no entanto, na maioria das vezes, o fornecedor da placa-mãe não emite atualizações freqüentes do BIOS / UEFI ou o usuário não instala essas atualizações. Por esses motivos, é provável que o processador do sistema esteja executando com microcódigo desatualizado em um grande número de sistemas.

Exemplos:

https://www.win-raid.com/t3355f47-Intel-AMD-amp-VIA-CPU-Microcode-Repositories.html

juliano
fonte
9
Não é assim tão simples: o microcódigo é "uma técnica que impõe um intérprete entre o hardware e o nível arquitetural de um computador". Como tal, o microcódigo é uma camada de instruções em nível de hardware que implementam instruções de código de máquina de nível superior ou sequenciamento de máquina de estado interno em muitos elementos de processamento digital. Fonte: en.wikipedia.org/wiki/Microcode
17
Então espere ... um "barco" é apenas um tipo específico de "veículo"? Que palavra inútil! :-)
Harry Johnston,
4
@HarryJohnston Bem, considero bastante útil distinguir "um barco" de outros tipos de veículos em determinados contextos ... e "microcódigo" é um tipo muito específico de "algo" que está presente em muitas CPUs modernas ... ( portanto, é bastante desejável ter um termo para isso).
Radovan Garabík
4
@ RadovanGarabík: Esse é exatamente o ponto de Harry, feito com sarcasmo.
Peter Cordes
4
Eu não entendo. Se "O kernel é capaz de atualizar o firmware do processador sem a necessidade de atualizá-lo através de uma atualização do BIOS", por que o fato de "o fornecedor da placa-mãe não emitir atualizações freqüentes do BIOS / UEFI" significa que "o processador do sistema é provável que esteja sendo executado com microcódigo desatualizado em um grande número de sistemas "? Por que o kernel não corrige apenas o microcódigo? Por que confiar no BIOS se o BIOS nunca é atualizado e há uma alternativa atualizada com mais freqüência disponível?
Ajedi32
6

Bem, as "atualizações de microcódigo" da Intel são, na verdade, atualizações de "firmware", no sentido de que atualizam muito mais do que apenas a unidade de conversão de microcódigo do processador.

Essas atualizações unificadas de pacotes de processadores que chamamos de "atualizações de microcódigo" para a Intel também atualizam outros microcontroladores na matriz (como a PMU e o núcleo de gerenciamento de energia), bem como várias tabelas de parâmetros para diferentes subsistemas de processadores na matriz. Eles são bastante complexos.

Esta informação está disponível em várias patentes da Intel relacionadas a atualizações de microcódigo e microcódigo.


fonte
4

Eu acho que o termo "microcódigo" se refere principalmente ao que o código faz (ele executa instruções de nível inferior usando instruções de nível ainda mais baixo), enquanto o termo "firmware" se refere principalmente ao modo como ele é armazenado e gerenciado (atualizado com menos facilidade do que o software , mais facilmente atualizado que o hardware). Nesse sentido, é mais ou menos como a distinção entre um "aplicativo" e um "arquivo JAR" - o mesmo programa pode ser ambos, mas você o observa de duas perspectivas diferentes.

Aliás, a idéia de microcódigo remonta a Maurice Wilkes em 1951, décadas antes de os processadores de computador serem incorporados em silício.

Michael Kay
fonte
3

O firmware geralmente se refere ao código de dispositivos que contêm uma CPU e não a própria CPU, por exemplo, o firmware de um telefone Android.

Microcódigo é uma camada de conversão entre conjuntos de instruções complexos (por exemplo, 486, 686, AMD-64 ect.) E as instruções de nível inferior para as quais os fabricantes de chips projetam silício. Portanto, várias instruções no conjunto de instruções da CPU não são implementadas em silício, mas traduzidas por microcódigo em várias instruções implementadas em silício.

David Waters
fonte
Mas, isso não é verdade para todo o firmware. Instruções ABIs que poderiam ser implementadas no Silicon, mas que não são e são atualizáveis ​​por meio de software?
Evan Carroll
11
"Atualizações de microcódigo" da Intel pode fazer muito mais do que modificar a forma como microcódigo instruções decodificar . por exemplo, eles podem desativar o buffer de loop (no Skylake para corrigir a errata do SKL150) porque, quando possível, a CPU é projetada para tornar isso possível no caso de erros de hardware serem descobertos.
Peter Cordes
3

"Microcódigo" era o termo original e se referia às instruções usadas para implementar um intérprete para o conjunto de instruções "público" de um processador.

Mas, com o tempo, com muitas variações nos esquemas de implementação, a distinção, como era, ficou mais vaga. Primeiro, havia um microcódigo horizontal versus vertical, depois vários esquemas para escrever "microcódigo" (para implementar, digamos, as instruções de E / S) no conjunto de instruções do processador "principal". Depois, havia a necessidade de distinguir entre código que era facilmente carregado por meio de operações comuns de "execução" do programa, código vs (para BIOS, por exemplo) que era salvo na ROM ou em algum outro armazenamento protegido e relativamente imutável. Assim, o termo "firmware" foi inventado para se referir a essas instruções, que de alguma forma se tornaram mais persistentes (e menos acessíveis para modificação do usuário) no armazenamento.

Mas as coisas mudaram e mudaram muitas vezes desde que essas primeiras distinções foram feitas, e mais os termos só podem ser definidos com precisão em um determinado processador e ambiente de SO.

Daniel R Hicks
fonte
+1, a chave aqui é que existem muitos significados do termo "microcódigo", e acho que o OP realmente quer saber sobre "atualizações de microcódigo", não os outros significados.
Peter Cordes
3

[Nota: esta resposta visa especificamente a edição recente e, de outra forma, não contribui para as várias respostas sonoras que já foram publicadas.]

Portanto, reiterar: microcódigo (pelo menos para uma primeira aproximação) é um tipo específico de firmware.

"Microcódigo" é, neste contexto, apenas marketing sobre "firmware do processador".

Bem, não é marketing. Comercialização teria chamado XBoost Pro (TM) ou algo assim. Pelo contrário, é um termo de engenharia; se você projetar CPUs, a distinção entre o microcódigo e o outro firmware da CPU (e o tipo de firmware típico de outros dispositivos) é importante para você. Se não, provavelmente não é.

Se você cria placas-mãe ou escreve sistemas operacionais, provavelmente usa a "atualização de microcódigo" como atalho para a "atualização de firmware da CPU" mais pesada e menos familiar. A maioria das atualizações de firmware da CPU afeta principalmente o microcódigo, por isso é suficientemente próximo da mesma coisa. Você provavelmente sabe a diferença, mas não precisa se preocupar com isso.

O usuário final não precisa saber ou se preocupar com a diferença e, em um mundo ideal, nunca ouviria a palavra "microcódigo".

Eu acho que isso chamou sua atenção na cobertura da imprensa sobre as recentes vulnerabilidades especulativas de execução, embora você também possa ter ouvido isso antes em um contexto que tornou mais óbvio que você não precisava se preocupar. Essas vulnerabilidades foram lançadas mais cedo do que o planejado, o que pode resultar na cobertura da imprensa com menos curadoria do que poderia ter sido. Do ponto de vista do usuário final, você precisa instalar atualizações do BIOS, atualizações do sistema operacional e, em alguns casos, atualizações de aplicativos; você não precisa saber nem se importar se algum deles inclui um novo microcódigo.


Assim, mesmo percebendo que você provavelmente não precisa saber ou se importar, você ainda pode estar interessado por pura curiosidade: como você pode distinguir microcódigo de outro firmware?

Bem, a primeira coisa a reconhecer é que não existe necessariamente uma definição única e rápida, é mais uma situação de Bleggs e Rubes . Ainda assim, há algumas coisas que podemos dizer sobre microcódigo:

  • O microcódigo geralmente é executado dentro de uma CPU e não em uma CPU. Essa é a visão de alto nível.

  • A arquitetura do microcódigo normalmente parece bastante diferente da arquitetura do código comum, incluindo o firmware comum. É provável que seja altamente paralelo e seja implementado muito mais próximo do hardware. Várias das respostas existentes (incluindo sua própria resposta) discutem isso, embora seja necessário observar que os detalhes podem variar dependendo do design da CPU.

  • Embora o hardware geralmente seja projetado para executar apenas o firmware fornecido pelo fabricante, não é incomum o uso de firmware de terceiros - embora provavelmente invalide a garantia! O microcódigo de terceiros é muito mais raro, embora eu acredite que, nos tempos antigos (estou falando de quando uma CPU tinha o tamanho de uma caixa de pão), alguns usuários finais modificariam o microcódigo em suas CPUs. Até onde eu sei, isso não é possível no tipo de CPUs usadas em PCs.

  • O microcódigo geralmente traduz ou ajuda a implementar uma arquitetura de conjunto de instruções públicas, ou seja, executa o código da máquina que o designer do sistema operacional e os programadores de aplicativos usam. Mais sobre isso na próxima seção.


"Execução versus dados" muitas respostas usam esse paradigma

De maneiras confusas e diferentes, receio, mas abordarei meu próprio comentário. Esta seção também serve para expandir o último marcador acima. O objetivo aqui é tentar distinguir entre o trabalho que uma CPU está realizando (alcançado por uma combinação de hardware e microcódigo) e o trabalho que um dispositivo típico está realizando (alcançado por uma combinação de hardware e firmware). Vou escolher uma unidade de disco rígido SATA.

A unidade SATA segue as instruções do computador, seguindo as linhas de "leia os dados do setor 5.123" e "grave esses dados no setor 1.321". O firmware da unidade é responsável por fazer com que o hardware faça isso acontecer, e normalmente é um código bastante comum sendo executado em algum tipo de CPU embutida. As instruções da unidade chegam seqüencialmente, embora possam não ser processadas na ordem em que chegam. Essas instruções não são um programa, são enviadas por um programa em execução na CPU principal. Em particular, não há fluxo de controle, ou seja, nenhuma instrução para informar à unidade SATA quais instruções executar a seguir.

A CPU está encarregada do computador. Após concluir a inicialização, ele executa as instruções ("código da máquina") fornecidas pela placa-mãe (BIOS, outro tipo de firmware) que o direcionam para executar o código da máquina fornecido pelo sistema operacional que o instrui a executar o código da máquina fornecido por fornecedores de aplicativos. A própria CPU recupera o código da máquina da EEPROM (no caso do BIOS) ou RAM (no caso do sistema operacional e dos aplicativos). Em particular, o código da máquina possui um fluxo de controle: o código da máquina informa à CPU qual código da máquina executar a seguir. Você pode repetir o mesmo código de máquina repetidamente, executar diferentes bits de código, dependendo dos dados em que o código está trabalhando - as instruções em um idioma da interface do dispositivo, como o código SATA, podem executar um conjunto limitado de tarefas simples, mas o código da máquina pode Fazqualquer coisa . (Veja também Turing Completeness .)

Poderíamos reescrever esse ponto final acima: microcódigo geralmente implementa uma linguagem Turing Complete; firmware comum geralmente não.


O que significa dizer "instruções de hardware são interpretadas" com microcódigo.

Verdadeiro, mas provavelmente confuso; o ponto importante é a distinção entre código de máquina, que possui um fluxo de controle e é Turing Complete, e as instruções definidas por uma interface de dispositivo como SATA, que não tem e não é.


O "microcódigo" se aplica ao código executado nas placas de som

Não, as placas de som recebem instruções, não códigos, assim como as unidades SATA. As instruções podem ser como "reproduzir A sharp" ou "interpretar esses dados como uma forma de onda e reproduzi-los". Ainda é muito simples.

e placas de vídeo (GPUs)?

Placas de vídeo antiquadas (aquelas sem GPUs) são iguais às unidades SATA. As instruções são como "defina este pixel para esta cor" ou "escreva um A para esta posição".

... As GPUs são complicadas e ficam em algum lugar entre os dois mundos que tentei descrever acima. Provavelmente é mais simples pensar neles como um computador especializado localizado dentro do computador principal, que possui suas próprias CPUs. É verdade que dispositivos como unidades SATA também possuem CPUs incorporadas, mas a diferença é que a CPU incorporada em uma unidade SATA executa apenas o código fornecido pelo fabricante da unidade, enquanto as GPUs também executam o código fornecido pelo sistema operacional e / ou fornecedor do aplicativo. Realmente, essa é uma questão totalmente separada.


TL; DR: microcódigo é um tipo específico de firmware, que ajuda o hardware a implementar um conjunto de instruções Turing Complete.

Harry Johnston
fonte
1

Microcódigo ( "armazenamento de controle" ) são dados para residir em uma memória volátil ou não volátil - geralmente uma memória bastante pequena, mas muito ampla, cujos sinais de saída de dados são conectados às entradas de sinal de controle de unidades funcionais de hardware paralelas, lógica de controle aleatório, etc. As entradas de endereço da memória do microcódigo são fornecidas por uma máquina de estado que percorre uma palavra de memória ("instrução de microprograma") de cada vez, para sequenciar efetivamente os sinais de controle de um ou muitos blocos de hardware. Isso multiplica o tempo do hardware e permite que operações complexas sejam implementadas com uma lógica significativamente menos aleatória.

Nos microprocessadores modernos, pode haver uma hierarquia de unidades de microcódigo / sequenciamento necessárias para abstrair a microarquitetura física de silício para uma família de arquitetura mais geral com uma interface comum de "código de máquina". Por exemplo, pode haver várias camadas de microcódigo / sequenciamento para implementar decodificadores de instruções e unidades de ponto flutuante.

Firmware no sentido tradicional é qualquer software / dados que resida em uma memória não volátil, que é esperado que seja raro ou nunca seja alterado. Isso contrasta diretamente o software armazenado ou, melhor dizendo, gravado e executado a partir da memória do sistema, que muda constantemente. Microcódigo refere-se especificamente a dados que representam um microprograma para sequenciar o controle do hardware.

O microcódigo pode ser implementado no firmware / o firmware pode conter microcódigo, mas eles não são os mesmos.


fonte
11
As CPUs x86 modernas são muito mais conectadas do que você descreve; parece que você está descrevendo um 386 sem pipeline, não um Haswell / Skylake. As "atualizações de microcódigo" da Intel podem fazer muito mais do que modificar a decodificação das instruções microcodificadas . por exemplo, eles podem desativar o buffer de loop (no Skylake para corrigir a errata do SKL150) porque, quando possível, a CPU é projetada para tornar isso possível no caso de erros de hardware serem descobertos.
Peter Cordes
@PeterCordes 1) arquitetura x86 é irrelevante para apresentar o conceito de microcódigo 2) teve você entendeu minha resposta estaríamos de acordo que as sequências sinais de controle, como você alude
11
Não, os processadores Intel não são realmente sinais de controle. Eles não programam diretamente as unidades lógicas, como em um pipeline clássico do MIPS. Os uops são lidos pelo planejador fora de ordem para descobrir quais uops têm uma dependência de dados de quais outros uops. Este é um modelo interno muito diferente de algo como um 6502, em que as várias etapas da execução de uma única instrução são lidas em uma ROM de decodificação. O que você descreve é ​​um significado histórico do termo microcódigo, mas não são as "atualizações de microcódigo" para as CPUs modernas.
Peter Cordes
Onde eu mencionei (ou a pergunta sobre esse assunto) as microoperações Intel ou x86 (que NÃO são iguais a um "microprograma" em uma loja de controle)? Além disso, literalmente, qualquer coisa fornecida a partir de um armazenamento de controle é um sinal de controle, independentemente de o sinal ser sequenciado ou estático, lógico ou por um fio. O que eu descrevo é a definição literal de microcódigo, "atualizações de microcódigo" também. Você está atento ao aspecto de sequência da minha resposta, porque muitos dos referidos sinais em um Haswell serão estáticos. Para o registro, muitos são seqüenciados, o seqüenciamento não é mutuamente exclusivo para pipelining ou OoOE.
11
Portanto, você está respondendo corretamente a pergunta "o que é uma instrução microcodificada" , mas uma "atualização de microcódigo" para uma CPU não tem o mesmo significado técnico da palavra "microcódigo". Esse é um ponto importante que deve ser explicitado, pois acho que está na raiz da confusão do OP.
Peter Cordes
0

Firmware é um código executável colocado em uma ROM ou outra memória não volátil.

O objetivo original e principal do firmware é estar presente quando uma CPU é iniciada, por isso possui código a ser executado para iniciar ou inicializar qualquer sistema em que a CPU faça parte. No caso de PCs, o firmware também é usado para fornecer serviços ao sistema operacional em execução e também contém código para os controladores incorporados que controlam ventiladores, energia e algumas outras coisas, e código para o ME / PSP que é executado em segundo plano .

Os dispositivos periféricos que aceitam firmware, como discos rígidos, dispositivos USB etc., têm uma CPU incorporada.


Microcódigo não é um código executável, mas um código usado pelos recursos internos de um dispositivo.

Ele é carregado nas CPUs Intel ou AMD com uma instrução WRMSR. Carregar o firmware em um dispositivo envolve a programação de uma ROM ou mídia flash, ou a dependência de um pequeno programa carregador para estar presente no dispositivo para aceitar o firmware.

As atualizações de firmware e microcódigo estão em uma categoria semelhante - coisas que você precisa fazer para que o hardware funcione e pode precisar ser atualizado periodicamente - mas são coisas muito diferentes.

Instruções complexas em muitas CPUs não são conectadas diretamente no hardware, mas "executadas" por uma instalação menor do tipo CPU na CPU principal. O microcódigo controla essas operações. Isso remonta a pelo menos o Motorola 68000, que tinha um "MicroROM" contendo microcódigo.

Ninguém além dos processadores Intel ou AMD sabe o que o microcódigo realmente controla ou faz, pois não libera detalhes. Existem tentativas de hackear. Referência .

Na prática, as atualizações de microcódigo são essencialmente usadas para desativar instruções que causam problemas em modelos / etapas conhecidas de CPUs, e as CPUs mais recentes da Intel geralmente exigem pelo menos uma atualização de microcódigo antes de funcionarem de maneira confiável.


Pode-se obter alguma perspectiva sobre o que um microcódigo de CPU pode realmente fazer / realmente é, se você ler sobre a ROM de decodificação 6502 PLA - o 6502 é uma CPU antiga de 8 bits e suas instruções foram sequenciadas / controladas por um PLA interno. O PLA basicamente dizia quais partes do chip estavam envolvidas em cada etapa de cada instrução (as instruções 6502 variam de 2 a 7 ciclos). Isso está muito, muito antes de coisas como cache, arquitetura superescalar, previsão de ramificação, etc. Não tenho certeza se o microcódigo nas CPUs modernas controlaria algo como esse PLA.

LawrenceC
fonte
11
"Atualizações de microcódigo" da Intel pode fazer muito mais do que modificar a forma como microcódigo instruções decodificar . por exemplo, eles podem desativar o buffer de loop (no Skylake para corrigir a errata do SKL150) porque, quando possível, a CPU é projetada para tornar isso possível no caso de erros de hardware serem descobertos.
Peter Cordes
11
Ponto interessante sobre o PLA 6502, mas as CPUs em pipeline precisam ser mais conectadas do que isso. Os MIPS clássicos usavam campos diferentes da palavra-instrução para controlar diretamente a lógica interna de uma maneira um pouco semelhante à isso, mas é claro que uma CPU em pipeline possui várias instruções em voo, potencialmente uma para cada estágio da pipeline, se não houver paradas. (Ou para superescalares, 2 ou mais em cada estágio do pipeline, e para fora de ordem, é ainda mais complexo.) Muitos dos componentes internos das CPUs modernas são conectados, mas com botões que permitem atualizações de microcódigo.
Peter Cordes
0

Terminologia

Eu mesmo responderei usando apenas o contexto de uso neste pdf .

  • Firmware - O microcódigo é atualizado através de um caminho fornecido pelo firmware da CPU.

    "Normalmente, um patch de microcódigo é carregado na CPU pelo firmware da placa-mãe (por exemplo, BIOS ou UEFI) ou pelo sistema operacional durante o processo inicial de inicialização".

  • Microcódigo - são os próprios dados usados ​​pela "Instruction Decode Unit (IDU)". Uma IDU pode ser conectada por fio ou microcodificada . Microcodificado neste contexto significa simplesmente programado. TAMBÉM significa "a pluralidade de microcódigo". O IDU

    A UDI desempenha um papel central na unidade de controle e gera sinais de controle com base no conteúdo do registro de instruções.

  • Instrução de macro Uma instrução enviada para a UDI a ser decodificada pode retornar qualquer quantidade de micro-instruções .

  • Micro-instrução uma "palavra de controle" pré - computada, todo o estado e instruções a serem executadas por um ciclo de relógio. Enviado para a CPU para gerar os sinais de controle .

Portanto, nesse contexto, você atualizaria o microcódigo com o firmware. Você enviaria instruções macro à IDU microcodificada para resolver a instrução macro em uma "micro instrução" para execução na CPU, que os transforma em sinais de controle.

Minha leitura disso

Microcódigo são dados , mas a atualização do microcódigo é feita através do firmware. E, confundidamente, porque você está falando sobre o que basicamente significa uma tabela de pesquisa interna, certamente também é o próprio firmware , pois é essencialmente armazenado no chip e usado no fluxo de execução do chip. Eu acho que você poderia argumentar que MIDI geral, PostScript de hardware e sinais de controle para terminais burros também são interpretados no mesmo sentido, no hardware, e que algo requer a instrução e gera "sinais de controle" em algum tipo de processo de interpretação .

Parece que temos nomes especiais para esses processos e componentes dentro da CPU: "IDU" em uma CPU e um nome para a tabela de entrada específica que a IDU emprega, que contém todas as "microinstruções": o "microcódigo". As informações sobre esse processo são proprietárias e fechadas. Eu diria que é análogo a qualquer outra tecnologia, desde modems (com ATDT e similares em um modem Hayes) até cartões MIDI, mas não nomeamos a tabela de pesquisa específica "microcode" e, em vez disso, usamos o termo geral "firmware" para o processo de piscar e toda a carga armazenada no chip.

Evan Carroll
fonte
2
O Linux (e Windows) pode atualizar o microcódigo da CPU de maneira totalmente independente do firmware da placa-mãe da qual você está falando. Firmware placa-mãe faz conter o microcódigo mais recente CPU e um mecanismo para aplicá-lo antes de qualquer código é carregado a partir do disco, mas se você não tiver atualizado o firmware mobo por um tempo, você ainda pode ter o microcódigo mais recente CPU por apenas atualizar o software. Você está fazendo um acordo muito grande com a conexão entre o firmware mobo e o microcódigo da CPU. É útil fazer com que o firmware atualize o microcódigo a cada inicialização, mas não é necessário (exceto a estabilidade às vezes).
Peter Cordes
2
Além disso, nem todas as instruções de macro x86 são decodificadas procurando-as na ROM do seqüenciador de microcódigo. Nas CPUs Intel, as instruções que decodificam para 4 ou menos uops (micro-ops) são codificadas nos decodificadores. A maioria das instruções não é "microcodificada" nesse sentido da palavra. A divisão inteira é ( dive idiv), mas mesmo a divisão FP é uop único (porque é mais crítico em termos de desempenho, a lógica iterativa de várias etapas é feita dentro da unidade de divisão em vez de com uops microcodificados).
Peter Cordes
@ PeterCordes, você é o cara para escrever esta resposta, tente editar qualquer uma das minhas respostas para torná-las tecnicamente mais corretas. Você tem a carta branca. Embora eu tente fazer essas mudanças hoje à noite, se você estiver com pouco tempo.
Evan Carroll
Se eu resolver isso, terminarei de escrever a resposta que comecei. Por enquanto, a resposta de Harry Johnston é provavelmente a melhor até agora em responder ao que eu realmente quero saber (que é o que uma "atualização de microcódigo" realmente atualiza, que não é a mesma coisa que o "microcódigo de CPU" faz, porque é um nome-over simplificada, como é comum com material técnico que precisa de uma só palavra nomear o público em geral pode acompanhar).
Peter Cordes
0

Eu fiz um curso em design básico do ISA, principalmente no estudo e design de um processador RISC modelado a partir dos conceitos do MIPS. Aqui está o que eu vim para lembrar

Para meu entendimento, os blocos básicos de um processador, como registradores, ALUs, multiplexadores e módulos de memória, exigem certos sinais para que eles façam seu trabalho. Você chamaria esses sinais de sinais de "afirmação", uma vez que são os sinais necessários para operar esses blocos. As CPUs, em essência, são um bloco de espaguete de ALUs, módulos de memória, registradores e outro hardware. Significando que cada CPU deve afirmar uma certa sequência de sinais de controle para realizar seu trabalho (refiro-me a instruções básicas como ANDI, ORI, JMP, BNE, BEQ etc.). Eu tive sentimentos confusos sobre isso quando tive que afirmar os sinais (literalmente, passando por todas as instruções do MIPS) durante o teste e a depuração de um conjunto de instruções, pois o ritmo do currículo não havia me ensinado nada sobre as unidades de controle naquele momento.

Por outro lado, a linguagem assembler se resume a opcodes e seus operandos na palavra de instrução (basicamente a largura do seu barramento de dados). Em termos de MIPS, os primeiros 6 bits da sua palavra de instrução são o seu código de operação. Por pura inspeção matemática, você não pode "afirmar" sua ULA, registro, memória, muxes ... basicamente o restante do seu hardware com apenas 6 bits.

A menos que você tenha ... UM DECODIFICADOR DE INSTRUÇÕES. O decodificador de instruções basicamente pega seu código de operação e gera TODOS os sinais de "afirmação" necessários para operar seu hardware. No entanto, os decodificadores de instruções diferem na implementação entre arquiteturas e, em alguns casos, são programáveis. O microcódigo afeta a seção programável do decodificador de instruções.

Eu acredito que firmware é um termo geral para qualquer informação incorporada no hardware. Em alguns casos, ele também se refere ao microcódigo, pois o fluxo de bits pode ser codificado e armazenado em hardware como EEPROM e memória flash. Na maioria das vezes, no entanto, é um código compilado, asm ou mesmo fluxos de bits VHDL / Verilog usados ​​em FPGAs. Microcódigo para mim parece semântica usada para especificar os "sinais de asserção" no processador de sua escolha.

Jackson Young
fonte
-2

O microcódigo é um firmware sub-asm, integrado à CPU.

peterh
fonte