Millä ohjelmointikielellä kirjoitetaan BIOS-ohjelma?

Kuten ymmärrän, ROM-levyllä olevan BIOS-koodin / bittivirran tulee olla yleinen (toimimaan yhdessä useiden suorittimen tai ISA: n kanssa). Lisäksi huomasin mainitsevani verkossa, että sen koodi on mahdollista tyhjentää (ja ”purkaa”).

Millä kielellä, käskyjoukolla tai konekoodilla se kirjoitetaan? Eikö se tarvitse minkäänlaista prosessoria toimintojensa suorittamiseen? Jos on, luulen, että se käyttää ulkoista suorittinta, niin mistä se tietää käyttämänsä tietyn käskykokonaisuuden?

Ehkä se Onko sinulla sisäinen prosessori?

Kommentit

  • mahdollinen kopio Miten tietokoneet toimivat?
  • Ristipostaus on tarpeeksi huono, mutta kun se päätyy kuumaverkkokysymyksiin molemmissa versioissa , että ’ s aivan vaalean takana …
  • ” BIOS-koodi / bittivirta, joka ROM-levyn on oltava yleinen (toimittava yhdessä useiden suorittimen tyyppien tai ISA: n kanssa). ” – En ole koskaan kuullut BIOSista, joka toimii useiden ISA: iden kanssa. onko sinulla esimerkki?
  • As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). sanon ’ sanon ” Ei, päinvastoin ”
  • Tämä ei ole edes etämainos niin yleisen kysymyksen kopio kuin ” Miten tietokoneet toimivat? ”. Älä sulje dupe-tiedostona.

Vastaa

BIOSit kirjoitettiin aiemmin vain kokoonpanokielellä, mutta Siirtyminen tehtiin kauan sitten kirjoittamaan suurin osa koodista jollakin ylemmän tason kielellä ja jättämään kokoonpanossa kirjoitettu mahdollisimman vähän osia siitä, mieluiten vain bootstrapper (ensimmäiset muutamat sadat ohjeet, jotka CPU hyppää aloitus / nollaus -toiminnon jälkeen), ja kaikki rutiinit käsittelevät taustalla olevan arkkitehtuurin tiettyjä haittoja.

BIOS-tiedostoja kirjoitettiin jo ensisijaisesti C: ssä jo 1990-luvun alussa. (Kirjoitin BIOSin 90% C: ssä, 10% kokoonpanossa 90-luvun alussa.)

Mikä on myös auttanut suuresti tähän suuntaan:

  • C kirjastot, jotka kohdistuvat tiettyyn arkkitehtuuriin ja sisältävät toimintoja kyseisen arkkitehtuurin erityispiirteiden käsittelemiseksi, esimerkiksi toiminnot tavujen lukemiseksi / kirjoittamiseksi x86-arkkitehtuurin I / O-portteihin / niistä. Microsoft C on aina tarjonnut kirjastotoimintoja tällaisille asioille.

  • C-kääntäjät, jotka eivät vain kohdista tiettyä suorittimen arkkitehtuuria, mutta tarjoavat jopa laajennuksia C-kielelle, jota voit käyttää jotta voidaan kirjoittaa koodia, joka käyttää erityisiä CPU-ominaisuuksia. Esimerkiksi x86-arkkitehtuuri tukee keskeytyksiksi kutsuttuja asioita, jotka kutsuvat keskeytyskäsittelijöiksi kutsuttuja rutiineja, ja se vaatii heiltä erityisiä syöttö- / poistumiskäskyjaksoja. Alusta lähtien Microsoft C tuki erityisiä avainsanoja, joita voit käyttää toiminnon merkitsemiseen keskeytyskäsittelijäksi, joten CPU-keskeytys voi kutsua sen suoraan, joten sinun ei tarvinnut kirjoittaa mitään kokoonpanoa sitä varten. P Oletan, että nykyään suurin osa BIOSista on kirjoitettu C ++: lla, ellei jollakin korkeamman tason kielellä.

    Valtaosa koodista, joka muodostaa BIOS on erityinen taustalla olevalle laitteistolle, joten sen ei tarvitse olla kannettava: taataan, että se toimii aina samantyyppisellä suorittimella. Suoritin voi kehittyä, mutta niin kauan kuin se ylläpitää taaksepäin yhteensopivuutta aiempien versioiden kanssa, se voi silti käyttää BIOSia muokkaamattomana. Lisäksi voit aina kääntää uudelleen C: ssä kirjoitetut BIOSin osat ajamaan luonnollisesti mitä tahansa uutta esiin tulevaa prosessoria, jos tarvetta ilmenee.

    Syy, miksi kirjoitamme BIOSeja korkeammalla kielellä kuin kokoonpano johtuu siitä, että niitä on helpompi kirjoittaa tällä tavalla, ei siksi, että niiden on todella oltava kannettavia.

    Kommentit

    • Kyllä. Joskus emolevy voi olla sidottu paitsi tiettyyn suorittimen arkkitehtuuriin, myös tiettyyn suorittimen myyjään. Nykyään voit ostaa x86-emolevyn, joka on yhteensopiva vain Intel x86 -prosessorien kanssa, tai x86-emolevyn, joka on yhteensopiva vain AMD x86 -prosessoreiden kanssa. Näiden emolevyjen BIOS on suuressa määrin identtinen, koska molemmissa tapauksissa CPU ymmärtää x86-käskyjoukon ja suurin osa oheislaitteista on identtisiä, mutta joillakin oheislaitteilla on eroja, jotka BIOSin on otettava huomioon.
    • @Heijastus tarkastele tarkasti, miltä emolevy fyysisesti näyttää. CPU-liitännässä on tietty nastajärjestely, joka on ominaista sen hyväksymien suorittimien perheelle.Et voi fyysisesti yhdistää sanoa Intel P4: ää AMD Opteronin emolevyyn.
    • Termi ” BIOS ” viittaa ” Tietokoneen perus- tulo- / lähtöjärjestelmä ”, joten BIOS-käyttö edellyttää x86-prosessoria. IA64-järjestelmissä on EFI BIOSin sijaan, PowerPC-järjestelmissä voi olla avoin tai oma laiteohjelmisto, Sparc-järjestelmissä on myös OFW (tai pikemminkin OpenBoot), OLPC X0 on x86-pohjainen järjestelmä, joka käyttää OFW: tä. Jopa tietokoneet eivät ’ käytä enää BIOSia, vaan ne ovat siirtyneet (U) EFI: ksi. OB / OFW on mielenkiintoinen, koska se on suunniteltu paitsi kannettavaksi myös monitasoiseksi. OFW-ohjaimet toimivat missä tahansa OFW-järjestelmässä, ne ovat ” Kirjoita kerran suoritettu mihin tahansa ” riippumatta prosessorista ISA.
    • ” Oletan nykyään, että suurin osa BIOSista on kirjoitettu C ++ ” En halua ’ t välttämättä olettaa, että se voi olla totta, mutta työskentelen tällä alalla ja varmasti monet käynnistyskuormaajat on kirjoitettu yksinkertaisella C. Ihmiset, jotka kirjoittavat tällaisia juttuja, ovat usein ” Old Guard ” eikä yleensä luota C ++: een silti.
    • @TomDworzanski: Vaikka teknisesti ei BIOS (joka viittaa yksinomaan vanhaan PC-aineistoon vuonna 1981), monet IEEE-1275 Open Firmware -ratkaisut (joita käytetään samanlaisessa roolissa kuin Sparcin BIOS, PowerPC Common Hardware Reference Platform (esim. PowerMac, PowerBook), 100 dollarin kannettava OLPC X0 -1) kirjoitetaan osittain muilla kielillä kuin assembly / C. OpenBoot , Avaa laiteohjelmisto , OpenBIOS kaikki sisältävät…

vastaus

Vaikka teoriassa voidaan kirjoittaa BIOS millä tahansa kielellä, moderni todellisuus on suurin osa BIOSista kirjoitetaan käyttämällä Assembly, C: tä tai näiden kahden yhdistelmää .

BIOS on kirjoitettava kielellä, joka voi kääntyä konekoodiksi , jonka fyysinen laitteisto ymmärtää. Tämä eliminoi suoraan tai välitulkitut kielet (Perl, Python, PHP, Ruby, Java, C #, JavaScript jne.) Sopiviksi BIOSin kirjoittamiseen. (Vaikka teoriassa voitaisiin toteuttaa yksi näistä kielistä joko kääntääkseen suoraan staattiseen konekoodiin tai tulkin voisi jotenkin upottaa BIOSiin. On esimerkiksi hylkää GCJ-projekti Java: lle.)

Suurin osa alkuperäisistä valmistajista ottaa käyttöön BIOSin laajentamalla sellaisten yritysten omistamia, yleisiä BIOS-toteutuksia, kuten American Megatrends ja Phoenix Techologies . (Olet todennäköisesti nähnyt yhden näistä yrityksistä esillä tietokoneen ensimmäisellä käynnistysnäytöllä aiemmin.) Näiden toteutusten lähdekoodi ei ole julkisesti saatavilla, mutta osa siitä on vuotanut. En halua linkittää suoraan tähän C- ja kokoonpanon lähdekoodiin, mutta Internetissä on paikkoja, joissa tästä lähdekoodista keskustellaan niille, jotka haluavat kurkistaa.

Jotkut laitteistovalmistajat, kuten korkean suorituskyvyn ja pelimarkkinoille suunnatut, kyllästävät BIOS-toteutuksensa mukautusominaisuuksilla, tilastoilla ja houkuttelevilla käyttöliittymillä, jotka on suunniteltu niiden täsmälliseen käyttöönottoon. Monet näistä ominaisuuksista ylittävät tuotettujen geneeristen tuotteiden tarjoamien ominaisuuksien American Megatrends ja muut. Valitettavasti nämä yritykset pitävät lähdekoodinsa julkaisemista turvallisuusriskinä , joten näistä huippuluokan toteutuksista tiedetään vain vähän, koska heistä jaetaan vähän. Yksi pari Tietysti löydän tapoja käyttää ja purkaa tällaisia BIOS-toteutuksia, mutta se voi olla vaikeaa ja mahdollisesti laitonta.

Palatakseni alkuperäiseen kysymykseen, koska on tarpeen tuottaa natiivi konekoodi, BIOS tulisi ottaa käyttöön ohjelmointikielessä, jota natiivikoneen kääntäjä tukee . Vaikka tällaisia kieliä on paljon ja vaikka olen varma viime vuosikymmenien aikana, kokeilussa on käytetty useita kieliä, jokainen avoin BIOS-toteutus, jonka olen löytänyt, perustuu nimenomaan C: n ja / tai kokoonpanon yhdistelmään. -lähdetyt BIOS-toteutukset, joita tarkastelin muodostaakseni tämän johtopäätöksen, sisältävät OpenBIOS , tinyBIOS , coreboot , Intel BIOS ja Libreboot . Katsoin myös joitain hyvin vanhoja BIOS-toteutuksia, jotka eivät ole nykyään merkityksellisiä, mutta noudoin myös C- ja / tai kokoonpanosääntöä.

Mielestäni on myös tarkoituksenmukaista tarkastella muita ohjelmistoja, jotka on rakennettu vuorovaikutuksessa suoraan laitteiston kanssa.Tiedämme esimerkiksi, että Linux-ydin , OS X -ydin ja Windows-ydin ovat suurimmaksi osaksi C-tiedostoja, joissa on joitain kokoonpanoja ja joitain korkeamman tason kieliä tiettyihin tehtäviin. Tiedämme myös, että laitteistoajurit Linuxissa ja laitteistoajurit Windowsissa on kirjoitettu suurimmaksi osaksi C .

Palatakseni takaisin BIOS: iin, mielestäni on myös tärkeää ottaa huomioon valitun ohjelmointikielen taloudellisuus. BIOS on yleensä kirjoitettu välttämättömyydeksi täydentää laitteistomyyntiä. Nykyaikaisten BIOS-järjestelmien tiedetään olevan suurelta osin kirjoitettu C: ssä ja / tai kokoonpanossa. Siirtyminen johonkin muuhun työkaluun lisäisi merkittäviä kustannuksia tavaroille, joita pidetään yleensä hyödyketuotteina, mikä voisi vaikuttaa erittäin kielteisesti myyntiin. Siirtymättä Economics 101: een voin vakuuttaa teille, ettei se todennäköisesti ole OEM-valmistajan kannattaa poiketa vuosikymmenien ajan todistetuista kokeiltuista työkaluista.

Tietysti on ja tulee olemaan harrastajaprojekteja myös BIOSin kirjoittamiseksi. Myös nämä näyttävät toistaiseksi valitsevan C: n ja / tai kokoonpanon. Ehkä jonain päivänä käytetään muita tekniikoita. Mutta tänään valinta on hyvin määritelty.

Kommentit

  • Se on vähän nokkelaa, mutta C #: ta ja Java: ta ei tulkita. . Ne kääntyvät tavukoodiksi. Se on tavukoodi, jonka tulkki käsittelee. Ei muuta ’ t ensimmäisen kappaleen logiikkaa.
  • @Tonny Se, että ’ on oikein. Lisäsin ” suoraan tai välitulkitse ” -tulkinnan selkeämmäksi.
  • @Tonny normaalisti värähtely pikemminkin kuin tulkki, mikä on tärkeä ero, koska se ’ on mahdollista esikatsella kaikki natiiviksi, kunhan tiettyjä dynaamisia tekniikoita ei ole ’ ei käytetty. Sellaisena olisi lähes teoreettisesti mahdollista kirjoittaa BIOS .NET-kielillä tai Java: lla, jos molemmat tekisivät sen ja varmistaisimme, että kaikki tarvittava ajonaikainen tuki oli käytettävissä. Kuvittelen, että ponnistelut sen tekemiseksi eivät pelkästään kääpiö löydetyistä mukavuuksista.
  • @Tonny Itse asiassa C # kääntyy alkuperäiskoodiksi msdn.microsoft.com/fi -us / vstudio / dotnetnative.aspx , joten on ’ outoa nähdä se heikkojen / dynaamisten kielten luettelossa.
  • @Den C # on ei tyypillisesti käännetty alkuperäiseen koodiin. Tätä .Net Native -tuotetta, johon linkität, ei ole vielä julkaistu virallisesti. ’ Olen lukenut siitä, että se kokoaa sovelluskoodin ja tarvittavan kehyskoodin suoritettavaksi. UKK: n mukaan tämä kohdistetaan alun perin Windows Store -sovelluksiin, joten voi kestää jonkin aikaa, ennen kuin sitä tuetaan laajemmin. Kaikesta huolimatta näyttää siltä, että Microsoft voi siirtyä pois virtuaalikoneen mallista jonkin aikaa tulevaisuudessa, jos kaikki menee hyvin.

Vastaa

Tietokoneen todellinen BIOS kirjoitettaisiin jollakin kielellä (luultavasti C tai kokoonpano), joka on käännetty arkkitehtuurista riippuvaiselle binaarikoodille; tämä koodi ei voi toimia millään muulla arkkitehtuurilla (ja kiistatta sen ei tarvitse, koska se on jo hyvin spesifinen koneelle, jolla se toimitetaan).

Mutta ajatteletko mahdollisesti Vaihtoehtoiset ROM-levyt (joita kutsutaan joskus BIOSeiksi, kuten GPU-vaihtoehto-ROM-levyjen kohdassa ”Video BIOS”)?

Todellinen, vanha BIOS-yhteensopiva vaihtoehtoiset ROM-levyt, ne olisivat todennäköisesti ISA-riippuvainen suoritettava koodi (joka on luotu uudelleen millä tahansa kielellä, joka voidaan kääntää kohdentamaan haluttu arkkitehtuuri); PCI myös sallii koodin sisällyttämisen useille ISA-tunnuksille ja antaa isännän valita sopivan binaarikuvan käynnistysprosessin aikana.

UEFI-yhteensopiva vaihtoehto ROM-levyillä on myös arkkitehtuurista riippumaton tavukoodimuoto , joka voidaan suorittaa eri arkkitehtuureilla, mutta myös ISA-riippuvaa koodia voidaan käyttää.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *