Qual linguagem de programação é usada para escrever um programa de BIOS?

65

Pelo que entendi, o código do BIOS / fluxo de bits mantido na ROM deve ser genérico (trabalhe junto com vários tipos de CPU ou ISAs). Além disso, vi mencionado na web que é possível despejar seu código (e "desmontá-lo").

Então, em que idioma, conjunto de instruções ou código de máquina está escrito? Não precisa de nenhum tipo de processador para executar suas operações? Nesse caso, acho que ele usará a CPU externa, então como ele conhece o conjunto de instruções específicas do empregado?

Talvez tenha um processador interno?

Reflexão
fonte
9
possível duplicata de How Do Computers Work?
Gnat
39
Postagem Cruz é ruim o suficiente, mas quando ele acaba nas Questões de Rede Hot em ambas as versões , isso é um pouco além dos limites ...
Mason Wheeler
8
"O código do BIOS / fluxo de bits contido na ROM deve ser genérico (trabalhe junto com vários tipos de CPU ou ISAs)." - Nunca ouvi falar de um BIOS que funcione com vários ISAs. Você tem um exemplo?
chx 30/09
6
As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). Eu diria "Não, pelo contrário"
edc65
11
Isso nem sequer é remotamente uma duplicata de uma pergunta tão geral quanto "Como os computadores funcionam?". Por favor, não feche como idiota.
Andres F.

Respostas:

103

Os BIOS costumavam ser escritos exclusivamente em linguagem assembly, mas a transição foi feita há muito tempo para escrever a maioria do código em alguma linguagem de nível superior e deixar escritos em assembly o menor número possível de partes, de preferência apenas o bootstrapper, (as primeiras centenas de instruções para as quais a CPU salta após uma inicialização / redefinição) e as rotinas que lidam com peculiaridades específicas da arquitetura subjacente.

Os BIOS já estavam sendo escritos principalmente em C no início dos anos noventa. (Eu escrevi um BIOS em 90% C, 10% no início dos anos 90.)

O que também ajudou muito nessa direção é:

  • Bibliotecas C que têm como alvo uma arquitetura específica e incluem funções para lidar com peculiaridades dessa arquitetura, por exemplo, funções para ler / gravar bytes em / de portas de E / S da arquitetura x86. O Microsoft C sempre ofereceu funções de biblioteca para esse tipo de coisa.

  • Compiladores C que não apenas visam uma arquitetura específica da CPU, mas também oferecem extensões para a linguagem C que você pode usar para escrever código que utiliza recursos especiais da CPU. Por exemplo, a arquitetura x86 suporta coisas conhecidas como interrupções, que invocam rotinas conhecidas como manipuladores de interrupções, e exige que elas tenham sequências especiais de instruções de entrada / saída. Desde os primeiros dias, o Microsoft C suportava palavras-chave especiais que você poderia usar para marcar uma função como manipulador de interrupções, para que pudesse ser invocada diretamente por uma interrupção da CPU, para que você não precisasse escrever nenhum assembly.

Atualmente, eu diria que a maior parte do BIOS é escrita em C ++, se não em qualquer linguagem de nível superior.

A grande maioria do código que compõe um BIOS é específica do hardware subjacente, portanto, ele realmente não precisa ser portátil: é garantido que ele sempre será executado no mesmo tipo de CPU. A CPU pode evoluir, mas enquanto mantiver compatibilidade com versões anteriores, ainda poderá executar o BIOS sem modificação. Além disso, você sempre pode recompilar as partes do BIOS escritas em C para executar nativamente em qualquer nova CPU que surgir, se necessário.

A razão pela qual escrevemos BIOSs em idiomas de nível superior ao assembly é porque é mais fácil escrevê-los dessa maneira, não porque eles realmente precisam ser portáteis.

Mike Nakis
fonte
7
Sim. Às vezes, você pode até ter uma placa-mãe ligada não apenas a uma arquitetura específica da CPU, mas também a um fornecedor específico de CPU. Atualmente, você pode comprar uma placa-mãe x86 que é compatível apenas com CPUs Intel x86 ou uma placa-mãe x86 que é compatível apenas com CPUs AMD x86. O BIOS nessas placas-mãe será idêntico em grande medida, porque nos dois casos a CPU entende o conjunto de instruções x86 e a maioria dos periféricos é idêntica, mas alguns periféricos têm diferenças que o BIOS deve considerar.
Mike Nakis
4
@ Reflection dê uma olhada de perto em como uma placa-mãe se parece fisicamente. O soquete da CPU terá um certo arranjo de pinos, específico da família de CPUs que aceita. Você fisicamente não é possível conectar dizer um processador Intel P4 para uma placa-mãe AMD Opteron
Caleth
14
O termo "BIOS" refere-se ao "Sistema básico de entrada / saída" de um PC; portanto, ter um BIOS implica em uma CPU x86. Os sistemas IA64 têm um EFI em vez de um BIOS, os sistemas PowerPC podem ter um sistema Open Firmware ou proprietário, os sistemas Sparc também têm OFW (ou melhor, OpenBoot), o OLPC X0 é um sistema baseado em x86 que usa OFW. Mesmo os PCs não usam mais o BIOS, eles mudaram para (U) EFI. O OB / OFW é interessante, porque foi projetado não apenas para ser portátil, mas para várias plataformas. Os drivers OFW funcionam em qualquer sistema OFW, eles são "Write Once Run Anywhere", independentemente do CPU ISA.
Jörg W Mittag
14
"Hoje em dia, eu suponho que a maior parte do BIOS seja escrita em C ++." Eu não suporia necessariamente que isso pode ser verdade, mas eu trabalho nesse setor e certamente muitos gerenciadores de inicialização são escritos na linguagem C. As pessoas que escrevem esse tipo muitas vezes são o "Old Guard" e tendem a não confiar totalmente em C ++ ainda.
Sam
6
@ TomDworzanski: Embora tecnicamente não seja o BIOS (que se refere exclusivamente ao antigo material de PC de 1981), muitas implementações do IEEE-1275 Open Firmware (que é usado para uma função semelhante à BIOS do Sparc, a Plataforma de Referência de Hardware Comum PowerPC (por exemplo, PowerMac, PowerBook), o OLPC X0-1 de 100 $ laptop) são escritos parcialmente em idiomas diferentes de assembly / C. OpenBoot , Open Firmware , OpenBIOS todos contêm…
Jörg W Mittag
11

Enquanto, em teoria, é possível escrever BIOS em qualquer idioma, a realidade moderna é que a maioria dos BIOS é escrita usando Assembly, C ou uma combinação dos dois .

O BIOS deve ser escrito em uma linguagem que possa ser compilada no código da máquina , entendida pela máquina de hardware física. Isso elimina as linguagens interpretadas diretamente ou de forma intermediária (Perl, Python, PHP, Ruby, Java, C #, JavaScript etc.) como apropriadas para a gravação de BIOS. (Embora, em teoria, alguém possa implementar uma dessas linguagens para compilar diretamente o código estático da máquina ou de alguma forma incorporar o intérprete no BIOS. Existe, por exemplo, o projeto GCJ abandonware para Java.)

A maioria dos OEMs implementa um BIOS estendendo implementações genéricas e proprietárias de BIOS por empresas como American Megatrends e Phoenix Techologies . (Você provavelmente já viu uma dessas empresas exibida na primeira tela de inicialização de um computador.) O código fonte dessas implementações não está disponível ao público, mas algumas delas vazaram. Eu não quero vincular isso diretamente ao código-fonte C e assembly, mas há lugares na Internet em que esse código-fonte é discutido para aqueles que desejam espiar.

Alguns fabricantes de hardware, como aqueles voltados para os mercados de alto desempenho e jogos, saturam suas implementações de BIOS com recursos de personalização, estatísticas e atraentes interfaces de usuário projetadas para suas implementações exatas. Muitos desses recursos vão além do que é oferecido nos produtos genéricos produzidos pela American Megatrends e outros. Infelizmente, essas empresas costumam ver o lançamento de seu código-fonte como um risco à segurança ; pouco se sabe sobre essas implementações de ponta, porque pouco é compartilhado sobre elas. É claro que é possível encontrar maneiras de acessar e descompilar essas implementações de BIOS, mas isso pode ser difícil e possivelmente ilegal.

Voltando à pergunta original, devido à necessidade de produzir código de máquina nativo, um BIOS teria que ser implementado em uma linguagem de programação suportada por um compilador de código de máquina nativo . Embora existam muitas dessas linguagens e, embora eu tenha certeza de que, nas últimas décadas, várias linguagens tenham sido usadas em experimentação, todas as implementações abertas do BIOS que consegui encontrar dependem especificamente de uma combinação de C e / ou assembly. As implementações de BIOS de código aberto que observei para formar esta conclusão incluem OpenBIOS , tinyBIOS , coreboot , Intel BIOS e Libreboot. Também observei algumas implementações de BIOS muito antigas que não são relevantes hoje, mas também segui a regra C e / ou assembly.

Eu acho que também é relevante olhar para outros softwares criados para interagir diretamente com o hardware. Sabemos, por exemplo, que o kernel do Linux , o kernel do OS X e o kernel do Windows são amplamente C com alguns assembly e algumas linguagens de nível superior para tarefas específicas. Também sabemos que os drivers de hardware no Linux e de hardware no Windows são escritos principalmente em C.

Voltando ao BIOS, acho que também é importante considerar a economia da linguagem de programação escolhida. O BIOS geralmente é escrito como uma necessidade para complementar as vendas de hardware. Sabe-se que os sistemas BIOS modernos são amplamente escritos em C e / ou montagem. Uma mudança para outra ferramenta acrescentaria custos significativos ao que geralmente são considerados produtos de commodities que poderiam afetar adversamente as vendas. Sem entrar na Economics 101, posso garantir que provavelmente não vale a pena que um OEM se desvie das ferramentas testadas e comprovadas que foram comprovadas ao longo de décadas.

É claro que existem e haverá projetos amadores para escrever BIOS também. Até agora, esses também parecem escolher C e / ou montagem. Talvez um dia outras tecnologias sejam usadas. Mas hoje, a escolha de é bem definida.

Rich Smith
fonte
4
É um pouco complicado, mas C # e Java não são interpretados. Eles são compilados para código de bytes. É o código de bytes que é tratado por um intérprete. Não altera a lógica do primeiro parágrafo.
Tonny
11
@ Tonny Isso está correto. Eu adicionei "interpretado diretamente ou de forma intermediária" para ficar um pouco mais claro.
O @Tonny normalmente é um tremor em vez de um intérprete, o que é uma distinção importante porque é possível pré-ajustar tudo para o nativo, desde que certas técnicas dinâmicas não sejam usadas. Como tal, seria teoricamente possível escrever um BIOS em linguagens .NET ou Java, se alguém fizesse isso e se certificasse de que todo o suporte de tempo de execução necessário estivesse disponível. Imagino que os esforços para fazer isso superariam qualquer conveniência encontrada.
Jon Hanna
11
@Tonny Na verdade, o C # compila no código nativo msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx, por isso é estranho vê-lo na lista de idiomas fracos / dinâmicos.
Den
@Den C # normalmente não é compilado no código nativo. Este produto .Net Native ao qual você vincula ainda não foi lançado oficialmente. Pelo que li, ele compilará o código do aplicativo e o código da estrutura necessária em um executável. De acordo com as Perguntas frequentes, ele será direcionado inicialmente aos aplicativos da Windows Store, portanto, pode levar algum tempo para que esse suporte seja mais amplo. Tudo isso dito, parece que a Microsoft pode se afastar do modelo de máquina virtual em algum momento no futuro, se tudo correr bem.
4

O BIOS real de um computador seria escrito em alguma linguagem (provavelmente C ou assembly) que é compilada no código binário dependente da arquitetura; esse código não pode ser executado em nenhuma outra arquitetura (e sem dúvida não é necessário, pois já é muito específico da máquina com a qual é enviado).

Mas você está pensando nas ROMs de opção (às vezes chamadas de BIOS, como em "BIOS de vídeo" para uma ROM de opção de GPU)?

Para as ROMs opcionais compatíveis com o BIOS legado, provavelmente seriam códigos executáveis ​​dependentes do ISA (novamente gerados por qualquer idioma que possa ser compilado para atingir a arquitetura desejada); O PCI também permite incluir código para vários ISAs e permite que o host selecione a imagem binária apropriada durante o processo de inicialização.

Para as ROMs de opção compatíveis com UEFI, também existe um formato de código de bytes independente da arquitetura que pode ser executado em arquiteturas diferentes, mas o código dependente do ISA também pode ser usado.

lxgr
fonte