2014-08-23 3 views
19

È possibile scrivere un sistema operativo completamente in C?È possibile scrivere un sistema operativo completamente in C?

Completamente, includo tutto fino al bootloader, ma non al BIOS/UEFI.

+1

Dipende da cosa intendi in realtà quando dici "sistema operativo". Ho letto che è possibile che alcuni dei processori Cortex-M (molto limitati, usati per MCU) in un libro relativo a ARM, ma molto probabilmente su molti altri core sarete costretti a usare almeno un po 'di assembly per alcune basi configurazione. – user35443

risposta

20

La risposta tradizionale alla domanda "puoi scrivere un programma completamente in C" è "no". Il motivo è che non c'è modo per un programma C di creare il proprio stack.

Quasi ogni processore ha almeno un registro che indica l'indirizzo corrente nella pila (di solito chiamato il puntatore telaio) ea volte c'è un secondo registro (di solito chiamato il puntatore pila) che deve indicare il prossimo indirizzo inutilizzato nello stack. Non è possibile utilizzare alcuna espressione o istruzione nella lingua stessa per impostare il puntatore dello stack o il puntatore del frame su un valore assoluto. (Procedura chiama e ritorna può aggiungere e sottrarre lo stack pointer, ma non c'è modo per inizializzare a un valore noto.)

Posix definisce un insieme di funzioni, setcontext, getcontext, makecontext e swapcontext (quasi sempre scritto almeno in parte nell'assembler), che ti consentirà di leggere e scrivere il puntatore stack e frame.

Sfortunatamente, la famiglia di funzioni setcontext non è ampiamente implementata.

7

Teoricamente sì, ma non tutto.

Per il bootloader e la modalità reale, è possibile trovare qualche vecchio compilatore a 16 bit (ad esempio Turbo C), dargli l'output di plain binary e scrivere tutto ciò con esso.
Oppure, in GCC è possibile inserire asm(".code16gcc") nella parte superiore del codice, ma non è consigliabile, poiché GCC non è in grado di generare direttamente il codice a 16 bit, il programma di assemblaggio dei risultati potrebbe richiedere più di 512 byte.

Per altri scopi, annullare l'utilizzo dell'assieme non è possibile.
Sì, è possibile nascondere tutte le linee di assemblaggio all'interno delle funzioni inline (IN \ OUT, registri CRx e roba), ma per altre cose, come le interruzioni, sarete costretti a utilizzare l'assembly.

Edit:
Ora GCC (4.9.0) supporta l'opzione -m16 che consente 16-bit generazione del codice, quindi l'utilizzo complesso può essere ulteriormente ridotta per cose come settore di avvio/bootloader (alcuni bit richiederebbe ancora anche se).

7

Dipende da cosa si intende per C.

Se si intende il linguaggio di programmazione C standard definito da ISO, contando solo sui comportamenti definiti, e stai pensando di un sistema operativo varietà comune che gira su hardware , quindi no, non è possibile scrivere un pratico sistema operativo in C, perché C manca di molte strutture, in particolare per accedere all'hardware e per manipolare programmi separati.

È possibile scrivere un sistema operativo che consiste in un programma C e fornisce solo input/output tramite le strutture C, ma non è un sistema operativo eseguito su hardware reale. È possibile scrivere un emulatore per una macchina e il suo sistema operativo in questo modo.

Se si consentono comportamenti specifici dell'implementazione, la risposta è banalmente sì, poiché le implementazioni possono aggiungere le estensioni che ritengono appropriate. È sicuramente possibile avere un'implementazione C in cui operating_system(); è il codice sorgente di un programma che implementa un sistema operativo.

Se si intende indicare se è possibile utilizzare un tipico compilatore C per creare un sistema operativo (incluso un ambiente di runtime) senza utilizzare alcun assembly, la risposta di solito è no, perché i compilatori C in genere non hanno alcune primitive che sono solo di interesse per gli scrittori di sistemi operativi, come quello che serve per eseguire un cambio di contesto e stabilire uno stack. Tuttavia questa non è una regola assoluta. Se lo desideri, dipende da quali parti dell'ambiente di runtime provengono dal writer del compilatore e quali parti provengono dal writer del sistema operativo.

+0

Sarebbe possibile su un discreto numero di piattaforme scrivere un sistema operativo senza scrivere una singola riga di linguaggio assembly (usando solo le librerie fornite con il compilatore) anche se sarebbe sempre meglio scrivere almeno un po 'di macchina codice. Ad esempio, su molte piattaforme si potrebbe definire (come statica) un'unione di un 'jmp_buff' e un' char [] ', avere il punto di ingresso del programma singolarmente scrivere i caratteri di esso, e quindi fare un' longjmp' ad esso senza facendo uso di qualsiasi stack [si noti che memcpy o anche un'assegnazione di struct potrebbe essere una chiamata di subroutine, quindi non va bene]. – supercat

+0

Usare un po 'di assembly in-line per impostare lo stack sarebbe probabilmente più pulito (e possibilmente più portatile) della creazione byte-by-byte di un 'jmp_buff', ma usando tecniche come' jmp_buff' lo renderebbe possibile, in molte implementazioni, per configurare il sistema senza richiedere la compilazione di qualcosa di diverso dal codice C. – supercat