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


65

A quanto ho capito, il codice BIOS / bitstream che si trova 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").

Quindi, in quale lingua, set di istruzioni o codice macchina è scritto? Non ha bisogno di alcun tipo di processore per eseguire le sue operazioni? In tal caso, suppongo che utilizzerà la CPU esterna, quindi come fa a conoscere il set di istruzioni specifico di quella utilizzata?

Forse ha un processore interno?


9
possibile duplicato di Come funzionano i computer?
moscerino

39
Il cross posting è abbastanza male, ma quando finisce in Hot Network Questions in entrambe le versioni , è appena oltre il pallido ...
Mason Wheeler

8
"Il codice BIOS / bitstream contenuto nella ROM dovrebbe essere generico (lavorare insieme a più tipi di CPU o ISA)." - Non ho mai sentito parlare di un BIOS che funziona con più ISA. Hai un esempio?
chx,

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). Direi "No, al contrario"
edc65,

11
Questo non è nemmeno un duplicato remoto di una domanda generale come "Come funzionano i computer?". Si prega di non chiudere come duplicato.
Andres F.

Risposte:


103

I BIOS erano scritti esclusivamente in linguaggio assembly, ma la transizione è stata fatta molto tempo fa per scrivere la maggior parte del codice in un linguaggio di livello superiore e lasciare scritti nell'assemblaggio il minor numero possibile di parti, preferibilmente solo il bootstrapper, (le prime centinaia di istruzioni a cui la CPU passa dopo un avvio / ripristino) e qualsiasi routine si occupi di stranezze specifiche dell'architettura sottostante.

I BIOS erano già stati scritti principalmente in C già nei primi anni novanta. (Ho scritto un BIOS in 90% C, 10% assembly nei primi anni novanta.)

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

  • Librerie C che hanno come target un'architettura specifica e includono funzioni per gestire le peculiarità di quell'architettura, ad esempio funzioni per leggere / scrivere byte su / da porte I / O dell'architettura x86. Microsoft C ha sempre offerto funzioni di libreria per quel tipo di cose.

  • Compilatori C che non solo mirano a una specifica architettura della CPU ma offrono anche estensioni al linguaggio C che è possibile utilizzare per scrivere codice che utilizza funzioni CPU speciali. Ad esempio, l'architettura x86 supporta cose note come interrupt, che invocano routine note come gestori di interrupt e richiede loro di avere sequenze di istruzioni di entrata / uscita speciali. Sin dai primissimi tempi, Microsoft C supportava parole chiave speciali che potevi usare per contrassegnare una funzione come gestore di interrupt, in modo che potesse essere invocato direttamente da un interrupt della CPU, quindi non dovevi scrivere alcun assembly per esso.

Oggi suppongo che la maggior parte del BIOS sia scritta in C ++, se non in un linguaggio di livello superiore.

La stragrande maggioranza del codice che costituisce un BIOS è specifica dell'hardware sottostante, quindi non ha davvero bisogno di essere portatile: è garantito che funzionerà sempre sullo stesso tipo di CPU. La CPU può evolversi, ma purché mantenga la compatibilità con le versioni precedenti, può comunque eseguire il BIOS senza modifiche. Inoltre, puoi sempre ricompilare le parti del BIOS scritte in C per eseguire in modo nativo su qualsiasi nuova CPU che si presenta, se necessario.

Il motivo per cui scriviamo BIOS in lingue di livello superiore rispetto all'assembly è perché è più facile scriverli in questo modo, non perché hanno davvero bisogno di essere portatili.


7
Sì. A volte potresti persino avere una scheda madre legata non solo a una specifica architettura della CPU, ma anche a un fornitore specifico della CPU. Al giorno d'oggi è 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 in queste schede madri sarà identico in larga misura, perché in entrambi i casi la CPU comprende il set di istruzioni x86 e la maggior parte delle periferiche sono identiche, ma alcune periferiche hanno differenze, che il BIOS deve tenere in considerazione.
Mike Nakis,

4
@Riflessione osserva da vicino l'aspetto 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 è possibile connettersi fisicamente dire una Intel P4 a una scheda madre AMD Opteron
Caleth,

14
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 anziché un BIOS, i sistemi PowerPC possono avere un sistema Open Firmware o uno proprietario, i sistemi Sparc hanno anche OFW (o piuttosto OpenBoot), OLPC X0 è un sistema basato su 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 "Scrivi una volta eseguito ovunque", indipendentemente dalla CPU ISA.
Jörg W Mittag,

14
"Oggi suppongo che la maggior parte del BIOS sia scritta in C ++" Non lo presumo necessariamente, potrebbe essere vero, ma lavoro in quel settore e certamente molti bootloader sono scritti in chiaro C. Le persone che scrivono quel tipo di cose spesso sono la "Vecchia Guardia" e tendono a non fidarsi ancora del C ++.
Sam,

6
@TomDworzanski: anche se tecnicamente non BIOS (che si riferisce esclusivamente al vecchio materiale 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 PowerPC (ad es. PowerMac, PowerBook), il laptop OLPC X0-1 da 100 $) sono scritti in parte in lingue diverse da assembly / C. OpenBoot , Open Firmware , OpenBIOS contengono tutti ...
Jörg W Mittag

11

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

Il BIOS deve essere scritto in un linguaggio che può essere compilato in base al codice macchina , compreso dall'hardware fisico della macchina. Ciò elimina i linguaggi interpretati direttamente o intermedi (Perl, Python, PHP, Ruby, Java, C #, JavaScript, ecc.) Come appropriato 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 l'interprete nel BIOS. Esiste, ad esempio, il progetto GCJ diandonware per Java.)

La maggior parte degli OEM implementa un BIOS estendendo implementazioni di BIOS generiche proprietarie da aziende come American Megatrends e Phoenix Techologies . (Probabilmente hai già visto una di quelle aziende mostrate nella prima schermata di avvio di un computer in precedenza.) Il codice sorgente di queste implementazioni non è pubblicamente disponibile, 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 questo codice sorgente viene discusso per coloro che vogliono dare un'occhiata.

Alcuni produttori di hardware, come quelli destinati ai mercati ad alte prestazioni e di gioco, saturano le loro implementazioni BIOS con funzionalità di personalizzazione, statistiche e interfacce utente accattivanti progettate per le loro esatte implementazioni. Molte di queste caratteristiche vanno oltre ciò che viene offerto nei prodotti generici prodotti da American Megatrends e altri. Sfortunatamente, queste aziende vedono spesso il rilascio del loro codice sorgente come un rischio per la sicurezza , quindi si sa poco su queste implementazioni di fascia alta perché poco è condiviso su di loro. Naturalmente si potrebbero trovare modi per accedere e decompilare tali implementazioni del BIOS, ma ciò 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 . Mentre ci sono molti linguaggi di questo tipo e mentre sono sicuro negli ultimi decenni, sono state usate diverse lingue nella sperimentazione, ogni implementazione di BIOS aperta che sono stato in grado di trovare si basa specificamente su una combinazione di C e / o assembly. Le implementazioni del BIOS open source che ho esaminato per formare questa conclusione includono OpenBIOS , tinyBIOS , coreboot , Intel BIOS e Libreboot. Ho anche esaminato alcune implementazioni BIOS molto vecchie che non sono rilevanti oggi, ma hanno anche seguito la regola C e / o assembly.

Penso che sia anche importante guardare altri software creati per interagire direttamente con l'hardware. Sappiamo, ad esempio, che il kernel Linux , il kernel OS X e il kernel Windows sono in gran parte C con alcuni assembly e alcuni linguaggi di livello superiore per compiti specifici. Sappiamo anche che i driver hardware su Linux e i driver hardware su Windows sono scritti in gran parte in C.

Tornando al BIOS, penso che sia anche importante considerare l'economia 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 essere in gran parte scritti in C e / o assembly. Il passaggio ad altri strumenti aggiungerebbe costi significativi a quelli che sono generalmente considerati prodotti di base che potrebbero influire negativamente sulle vendite. Senza entrare in Economics 101, posso assicurarvi che probabilmente non vale la pena per un OEM discostarsi da strumenti collaudati che sono stati dimostrati nel corso di decenni.

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


4
È un po 'di nit-picking ma C # e Java non vengono interpretati. Compilano in codice byte. È il codice byte che viene quindi gestito da un interprete. Non cambia la logica del primo paragrafo.
Tonny,

1
@Tonny È corretto. Ho aggiunto "interpretazione diretta o intermedia" per essere un po 'più chiaro.

@Tonny normalmente un jitter piuttosto che un interprete, il che è una distinzione importante perché è possibile pre-jitare tutto su nativo purché non vengano utilizzate determinate tecniche dinamiche. In quanto tale sarebbe teoricamente possibile scrivere un BIOS in lingue .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 sarebbero più che nani qualsiasi comodità trovata però.
Jon Hanna,

1
@Tonny In realtà C # viene compilato nel codice nativo msdn.microsoft.com/en-us/vstudio/dotnetnative.aspx, quindi è strano vederlo nell'elenco dei linguaggi deboli / dinamici.
Den

@Den C # non viene in genere compilato in codice nativo. Questo prodotto nativo .Net a cui ti colleghi non è stato ancora rilasciato ufficialmente. Da quello che ho letto, compilerà il codice dell'applicazione e il codice framework richiesto in un eseguibile. Secondo le FAQ, questo sarà inizialmente indirizzato alle app di Windows Store, quindi potrebbe essere necessario del tempo perché questo sia supportato in modo più ampio. Detto questo, sembra che Microsoft potrebbe allontanarsi dal modello di macchina virtuale qualche volta in futuro se tutto andrà bene.

4

Il BIOS effettivo per un computer verrebbe scritto in un linguaggio (probabilmente C o assembly) compilato in codice binario dipendente dall'architettura; questo codice non può essere eseguito su nessun'altra architettura (e probabilmente non è proprio necessario, in quanto è già molto specifico per la macchina con cui viene spedito).

Ma stai forse pensando alle ROM opzionali (che a volte vengono chiamate BIOS, come in "BIOS video" per una ROM opzionale GPU)?

Per le ROM opzionali effettivamente compatibili con BIOS legacy, sarebbero probabilmente codice eseguibile dipendente da ISA (nuovamente generato da qualsiasi linguaggio che può essere compilato per indirizzare l'architettura desiderata); PCI consente inoltre di includere codice per più ISA e consente all'host di selezionare l'immagine binaria appropriata durante il processo di avvio.

Per le ROM opzionali compatibili UEFI, esiste anche un formato di codice byte indipendente dall'architettura che può essere eseguito su architetture diverse, ma è comunque possibile utilizzare anche codice dipendente da ISA.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.