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,
- "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 ..
- 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) ?
terminology
firmware
cpu
Evan Carroll
fonte
fonte
Respostas:
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:
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.
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.
fonte
https://wiki.debian.org/Microcode
Exemplos:
https://www.win-raid.com/t3355f47-Intel-AMD-amp-VIA-CPU-Microcode-Repositories.html
fonte
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
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.
fonte
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.
fonte
"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.
fonte
[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.
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.
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.
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 é.
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.
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.
fonte
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
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.
fonte
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.
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
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.
fonte
div
eidiv
), 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).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.
fonte
O microcódigo é um firmware sub-asm, integrado à CPU.
fonte