Quale linguaggio di programmazione viene utilizzato per scrivere un programma BIOS?

A quanto ho capito, il codice / bitstream del BIOS contenuto nella ROM dovrebbe essere generico (lavorare insieme a più tipi di CPU o ISA). Inoltre, ho visto menzionato sul web che è possibile scaricare il suo codice (e “smontarlo”).

Allora, in quale lingua, set di istruzioni o codice macchina è scritto? Non ha bisogno di alcun tipo di processore per eseguire le sue operazioni? In caso affermativo, immagino che utilizzerà la CPU esterna, allora come fa a conoscere il set di istruzioni specifico di quello impiegato?

Forse lo ha un processore interno?

Commenti

  • possibile duplicato di Come funzionano i computer?
  • Cross posting è già abbastanza brutto, ma quando finisce nelle Hot Network Questions in entrambe le versioni , quel ‘ è appena oltre il pallido …
  • ” codice BIOS / bitstream contenuto nel La ROM dovrebbe essere generica (funziona insieme a più tipi di CPU o ISA). ” – mai ho sentito parlare di un BIOS che funzioni con più ISA. hai un esempio?
  • As I understand, the BIOS code/bitstream that is held in the ROM should be generic (work alongside with multiple CPU types or ISAs). I ‘ dico ” No, al contrario ”
  • Questo non è nemmeno un annuncio remoto replica di una domanda generale come ” Come funzionano i computer? “. Si prega di non chiudere come ingannevole.

Risposta

I BIOS erano scritti esclusivamente in linguaggio assembly, ma il è stata fatta molto tempo fa per scrivere la maggior parte del codice in un linguaggio di livello superiore e lasciare scritto in assembly il minor numero di parti possibile, preferibilmente solo il programma di avvio automatico (le primissime centinaia di istruzioni che la CPU salta to after a start / reset,) e qualunque routine si occupi di stranezze specifiche dellarchitettura sottostante.

I BIOS erano già scritti principalmente in C allinizio degli anni novanta. (Ho scritto un BIOS al 90% C, 10% assembly allinizio degli anni novanta.)

Ciò che ha anche aiutato molto in questa direzione è:

  • C librerie che prendono di mira unarchitettura specifica e includono funzioni per trattare le peculiarità di quellarchitettura, ad esempio, funzioni per leggere / scrivere byte su / da porte I / O dellarchitettura x86. Microsoft C ha sempre offerto funzioni di libreria per questo genere di cose.

  • Compilatori C che non solo prendono di mira una specifica architettura della CPU, ma offrono anche estensioni al linguaggio C che puoi usare in per scrivere codice che utilizza caratteristiche speciali della CPU. Ad esempio, larchitettura x86 supporta cose note come interrupt, che invocano routine note come gestori di interrupt e richiede che abbiano speciali sequenze di istruzioni di ingresso / uscita. Fin dai primi giorni, Microsoft C supportava parole chiave speciali che potevi usare per contrassegnare una funzione come gestore di interrupt, quindi poteva essere invocata direttamente da un interrupt della CPU, quindi non dovevi scrivere alcun assembly per essa.

Oggigiorno presumo che la maggior parte del BIOS sia scritto in C ++, se non in un linguaggio di livello superiore.

La stragrande maggioranza del codice che compone un BIOS è specifico per lhardware sottostante, quindi non ha davvero bisogno di essere portabile: è garantito che funzionerà sempre sullo stesso tipo di CPU. La CPU può evolversi, ma fintanto che mantiene la compatibilità con le versioni precedenti, può ancora eseguire il BIOS senza modifiche. Inoltre, puoi sempre ricompilare le parti del BIOS scritte in C per eseguirle in modo nativo su qualsiasi nuova CPU che si presenta, se necessario.

Il motivo per cui scriviamo BIOS in linguaggi di livello superiore a assembly è perché è più facile scriverli in questo modo, non perché hanno davvero bisogno di essere portabili.

Commenti

  • Sì. A volte potresti persino avere una scheda madre associata non solo a una specifica architettura della CPU, ma anche a uno specifico fornitore di CPU. Al giorno doggi è possibile acquistare una scheda madre x86 compatibile solo con CPU Intel x86 o una scheda madre x86 compatibile solo con CPU AMD x86. Il BIOS di queste schede madri sarà sostanzialmente identico, perché in entrambi i casi la CPU comprende il set di istruzioni x86 e la maggior parte delle periferiche sono identiche, ma alcune presentano differenze, di cui il BIOS deve tenere conto.
  • @Reflection esamina da vicino laspetto fisico di una scheda madre. Il socket della CPU avrà una certa disposizione dei pin, che è specifica per la famiglia di CPU che accetta.Non puoi fisicamente connetterti, diciamo un Intel P4 a una scheda madre AMD Opteron
  • Il termine ” BIOS ” si riferisce al ” Sistema di input / output di base ” di un PC, quindi avere un BIOS implica una CPU x86. I sistemi IA64 hanno un EFI invece di un BIOS, i sistemi PowerPC possono avere un sistema Open Firmware o uno proprietario, i sistemi Sparc hanno anche OFW (o meglio OpenBoot), lOLPC X0 è un sistema x86 che utilizza OFW. Anche i PC ‘ non usano più il BIOS, sono passati a (U) EFI. OB / OFW è interessante, perché è progettato non solo per essere portatile ma multipiattaforma. I driver OFW funzionano su qualsiasi sistema OFW, sono ” Write Once Run Anywhere “, indipendentemente dalla CPU ISA.
  • ” Al giorno doggi presumo che la maggior parte del BIOS sia scritto in C ++ ” Non lo farei ‘ t necessariamente presumere che, Potrebbe essere vero ma io lavoro in quel settore e certamente molti boot loader sono scritti in chiaro C. Le persone che scrivono questo genere di cose sono spesso i ” Old Guard ” e tendono a non fidarsi ancora completamente di C ++.
  • @TomDworzanski: sebbene tecnicamente non BIOS (che si riferisce esclusivamente al vecchio PC del 1981), molte implementazioni di IEEE-1275 Open Firmware (che viene utilizzato per un ruolo simile al BIOS su Sparc, la piattaforma di riferimento hardware comune di PowerPC (ad esempio PowerMac, PowerBook), il laptop da 100 $ OLPC X0 -1) sono scritti in parte in lingue diverse da assembly / C. OpenBoot , Open Firmware , OpenBIOS contengono tutti…

Risposta

Mentre in teoria si può scrivere BIOS in qualsiasi lingua, il la realtà moderna è la maggior parte del BIOS è scritta utilizzando Assembly, C o una combinazione dei due .

Il BIOS deve essere scritto in un linguaggio che possa essere compilato nel codice macchina , compreso dalla macchina hardware fisica. Questo elimina i linguaggi interpretati in modo diretto o intermedio (Perl, Python, PHP, Ruby, Java, C #, JavaScript, ecc.) Come appropriati per la scrittura del BIOS. (Sebbene, in teoria, si potrebbe implementare uno di questi linguaggi per compilare direttamente in codice macchina statico o si potrebbe in qualche modo incorporare linterprete nel BIOS. Cè, ad esempio, il progetto di abbandono GCJ per Java.

La maggior parte degli OEM implementa un BIOS estendendo implementazioni di BIOS generiche e proprietarie da aziende come American Megatrends e Phoenix Techologies . (Probabilmente hai già visto una di quelle società visualizzate nella prima schermata di avvio di un computer.) Il codice sorgente per queste implementazioni non è disponibile pubblicamente, ma alcune di esse sono trapelate. Non voglio collegarmi direttamente a questo al codice sorgente C e assembly, ma ci sono posti su Internet in cui viene discusso questo codice sorgente per coloro che desiderano dare unocchiata.

Alcuni produttori di hardware, come quelli che si rivolgono ai mercati delle alte prestazioni e dei giochi, saturano le loro implementazioni BIOS con funzionalità di personalizzazione, statistiche e interfacce utente attraenti progettate per le loro esatte implementazioni. Molte di queste funzionalità vanno oltre ciò che viene offerto nei prodotti generici prodotti da American Megatrends e altri. Sfortunatamente, queste aziende spesso vedono il rilascio del loro codice sorgente come un rischio per la sicurezza , quindi si sa poco di queste implementazioni di fascia alta perché poco è condiviso su di loro Ovviamente ho trovato il modo di accedere e de-compilare tali implementazioni BIOS, ma farlo potrebbe essere difficile e forse illegale.

Tornando alla domanda originale, a causa della necessità di produrre codice macchina nativo, un BIOS dovrebbe essere implementato in un linguaggio di programmazione supportato da un compilatore di codice macchina nativo . Sebbene esistano molti di questi linguaggi e mentre sono sicuro che negli ultimi decenni sono stati utilizzati diversi linguaggi nella sperimentazione, ogni implementazione BIOS aperta che sono stato in grado di trovare si basa specificamente su una combinazione di C e / o assembly. Le implementazioni del BIOS di origine che ho esaminato per trarre questa conclusione includono OpenBIOS , tinyBIOS , coreboot , Intel BIOS e Libreboot . Ho anche esaminato alcune implementazioni BIOS molto vecchie che non sono rilevanti oggi, ma che seguivano anche la regola C e / o assembly.

Penso che sia rilevante anche guardare altri software costruiti per interagire direttamente con lhardware.Sappiamo, ad esempio, che il kernel Linux , il kernel OS X e il I kernel di Windows sono in gran parte C con alcuni assembly e alcuni linguaggi di livello superiore per attività specifiche. Sappiamo anche che i driver hardware su Linux e i driver hardware su Windows sono scritti principalmente in C .

Tornando al BIOS, penso sia anche importante considerare gli aspetti economici del linguaggio di programmazione scelto. Il BIOS è generalmente scritto come una necessità per integrare le vendite di hardware. I moderni sistemi BIOS sono noti per scritto in C e / o in assembly. Il passaggio a qualche altro strumento aggiungerebbe costi significativi a quelli che sono generalmente considerati prodotti di base che potrebbero influire negativamente sulle vendite. Senza entrare in Economics 101, posso assicurarti che probabilmente non lo è Vale la pena per un OEM deviare da strumenti collaudati che sono stati testati per decenni.

Ovviamente ci sono e saranno progetti hobbistici per scrivere anche BIOS. Anche questi, finora, sembrano scegliere C e / o assembly. Forse un giorno verranno utilizzate altre tecnologie. Ma oggi la scelta di è ben definita.

Commenti

  • È un po complicato ma C # e Java non vengono interpretati . Compilano in byte-code. È il codice byte che viene poi gestito da un interprete. ‘ non cambia la logica del primo paragrafo.
  • @Tonny Questo ‘ è corretto. Ho aggiunto ” direttamente o interpretato in modo intermedio ” per essere un po più chiaro.
  • @Tonny normalmente un jitter piuttosto che un interprete, che è una distinzione importante perché ‘ è possibile pre-jitare tutto in nativo purché alcune tecniche dinamiche non siano ‘ t usato. In quanto tale, sarebbe praticamente possibile scrivere un BIOS in linguaggi .NET o Java, se uno facesse entrambe le cose e si assicurasse che tutto il supporto di runtime necessario fosse disponibile. Immagino che gli sforzi per farlo renderebbero più che nano qualsiasi comodità trovata.
  • @Tonny In realtà C # compila il codice nativo msdn.microsoft.com/en -us / vstudio / dotnetnative.aspx quindi è ‘ strano vederlo nellelenco dei linguaggi deboli / dinamici.
  • @Den C # non è in genere compilato in codice nativo. Questo prodotto .Net Native a cui ti colleghi non è stato ancora ufficialmente rilasciato. Da quello che ‘ ho letto, compilerà il codice dellapplicazione e il codice del framework richiesto in un eseguibile. Secondo le domande frequenti, questo sarà inizialmente destinato alle app di Windows Store, quindi potrebbe essere necessario del tempo prima che sia supportato più ampiamente. Detto questo, sembra che Microsoft potrebbe abbandonare il modello di macchina virtuale in futuro, se tutto andrà bene.

Risposta

Il BIOS effettivo di un computer sarebbe scritto in un linguaggio (probabilmente C o assembly) compilato in codice binario dipendente dallarchitettura; questo codice non può essere eseguito su nessunaltra architettura (e probabilmente non ne ha davvero bisogno, poiché è già molto specifico per la macchina con cui viene fornito).

Ma forse stai pensando a Option ROM (che a volte sono chiamate BIOS, come in “Video BIOS” per una GPU option ROM)?

Per BIOS legacy effettivo compatibile ROM opzionali, sarebbero probabilmente codice eseguibile dipendente da ISA (nuovamente generato da qualsiasi linguaggio che può essere compilato per targetizzare larchitettura desiderata); PCI inoltre consente di includere il codice per più ISA e consente allhost di selezionare limmagine binaria appropriata durante il processo di avvio.

Per opzione compatibile UEFI ROM, esiste anche un formato di codice byte indipendente dallarchitettura che può essere eseguito su architetture diverse, ma è comunque possibile utilizzare anche codice dipendente da ISA.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *