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?
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"Respostas:
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.
fonte
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.
fonte
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.
fonte