Domanda

Questo potrebbe essere vano, poiché so che scrivere un sistema operativo è insopportabilmente complicato (specialmente da solo).

  • Non mi aspetto di costruire il prossimo Linux, o Windows.

  • So che sarà orribile, difettoso e non funzionerà, ma va bene.

Voglio scrivere tutto da solo, in Assembly , C e (alcuni) C ++ .

Questo è un progetto futuro, dato che al momento sono impegnato con alcune altre cose e non ho il tempo immediatamente, ma ho pensato che lo avrei chiesto ora, quindi forse avrei potuto ottenere molte risposte a questo, e potrebbe costruire ed essere una risorsa utile per questo tipo di approccio (tutto il resto che ho visto riguardava la creazione di minix, l'utilizzo di un bootloader esistente, la creazione in un programma di avvio virtuale, ecc.)

Voglio configurare uno dei miei desktop più vecchi con un monitor, una tastiera e un mouse e iniziare a lavorare su un disco rigido vuoto .

Voglio imparare a scrivere il mio bootloader (ho trovato molte risorse su questo, ma per completezza, per favore aggiungine ancora alcuni buoni), il mio driver USB (se necessario), un driver CD ( se necessario), ecc. Tutto, da zero.

  • Come posso inserire il codice sul computer? È meglio farlo con un floppy disk? La maggior parte dei computer può farlo da una chiavetta USB?

  • Di quali driver ho bisogno e puoi suggerire qualche riferimento per costruirli?

  • Dopo la sequenza di avvio - e allora? Come posso accedere alla modalità protetta ecc.

  • Come posso gestire la memoria senza l'aiuto di un sistema operativo? Uso solo gli indirizzi che desidero? Nessuna inizializzazione necessaria?

  • Cosa incontrerò senza dubbio per confondermi?

  • Come posso renderlo una riga di comando O / S e una grafica?

  • Su cosa si basa un O / S grafico? Come, come farei qualcosa del genere, una riga di comando, con un carattere e un'immagine in alto?

  • Dove posso leggere sulla configurazione di un ambiente multitasking? (vale a dire, con due righe di comando di tipo grafico in esecuzione fianco a fianco).

  • Come impostare una sorta di sistema di finestre? Come posso visualizzare la grafica sullo schermo dopo aver impostato il multitasking semplice?

Credimi, capisco che questo è un progetto molto complicato, e probabilmente non riuscirò mai a completarlo o a scrivere qualcosa su di esso di qualsiasi utilità.

Ci sono molti altri pezzi che non ho menzionato, se ne pensi, sentiti libero di aggiungere anche quelli.

Inserisci un & argomento; argomento " per risposta, ad esempio i driver USB e forse un elenco di risorse, elementi da cercare, ecc.

Inoltre, non suggerire di creare un altro O / S o un codice preesistente. So che leggerò un sacco di codice preesistente (come il kernel linux, o risorse di esempio, driver esistenti, ecc.) Ma alla fine voglio fare tutto da solo. So che dovrei basarmi su qualcos'altro, e ci sono molte altre domande su SO che posso leggere se cambio idea e seguo quella strada. Ma questo è tutto per fare tutto da zero.

Qualche suggerimento su come renderlo grafico? Diverse modalità video e come lavorare con esse, ecc.

È stato utile?

Soluzione

Per prima cosa. Leggi, leggi, leggi, leggi, leggi. Devi avere una solida conoscenza di come funziona il sistema operativo prima di poter sperare di implementare il tuo.

Prendi uno dei libri di Andrew Tanenbaum sui sistemi operativi. Questo è quello che abbiamo usato nella mia classe OS al college:

PDF per sistemi operativi moderni

Sistemi operativi moderni su Amazon

Nonostante la ridicola copertina, è una lettura fantastica, specialmente per un libro di testo. Tanenbaum è davvero un esperto in questo settore e le sue spiegazioni su come funziona il sistema operativo sotto il cofano sono chiare e facili da capire. Questo libro è per lo più teoria, ma credo che abbia anche un libro che discute maggiormente dell'implementazione. Non l'ho mai letto, quindi, quindi non posso commentarlo.

Ciò dovrebbe aiutarti ad analizzare la gestione dei processi, la gestione della memoria, i filesystem e tutto ciò che il tuo kernel OS deve fare per portarlo a uno stato di avvio. Da quel momento in poi si tratta essenzialmente di scrivere driver di dispositivo per l'hardware che è necessario supportare e offrire implementazioni delle funzioni della libreria C per effettuare chiamate del kernel per cose come l'apertura di file e dispositivi, lettura e scrittura, passaggio di messaggi tra processi, ecc. .

Leggi sull'assembly x86 (supponendo che tu lo stia progettando per una macchina x86). Ciò dovrebbe rispondere a molte delle tue domande in merito allo spostamento tra le modalità operative del processore.

Se hai qualche conoscenza dell'elettronica, potrebbe essere più facile iniziare a scrivere un sistema operativo per un dispositivo incorporato che abbia un'ampia documentazione, perché sarà generalmente più semplice di un PC x86. Ho sempre voluto scrivere anche il mio sistema operativo e sto iniziando a scrivere un sistema operativo incorporato microkernel per Questa scheda di sviluppo di Digilent. Può eseguire il processore MicroBlaze soft-core di Xilinx, che ha una documentazione molto approfondita. Ha anche un po 'di RAM, memoria flash, LED, switch, pulsanti, uscita VGA, ecc. Un sacco di cose da giocare con la scrittura di semplici driver per.

Uno dei vantaggi di un dispositivo incorporato è anche la possibilità di evitare di scrivere a lungo un driver VGA. Nel mio caso, la scheda di sviluppo Digilent ha un UART integrato, quindi posso utilizzare efficacemente l'output seriale come console per ottenere tutto e avviarlo su una riga di comando con il minimo sforzo.

Assicurati solo che qualsiasi cosa tu scelga di scegliere come target abbia un compilatore prontamente disponibile e ben collaudato. non vuoi scrivere contemporaneamente un SO e un compilatore.

Altri suggerimenti

http://www.osdev.org/ e http://www.osdever.net/

benvenuto nel mondo dello sviluppo del sistema operativo.

Vedi anche altri collegamenti alla documentazione x86 nelle tag wiki : manuali Intel e AMD, documenti compilatore / assemblatore e varie guide.

Suggerisce inoltre di utilizzare BOCHS o altri ambienti virtuali per il debug, poiché è possibile eseguire il passaggio singolo del bootloader ed esaminare i registri.

Suggerirei di lavorare, almeno all'inizio, su Bochs o su qualche altra macchina virtuale, il motivo è che puoi portarlo con te dove vuoi, è più facile eseguire il debug (puoi vedere lo stato esatto dell'hardware) e se hai bisogno di aiuto esterno per il debug possono usare esattamente lo stesso 'hardware' come te.

Il consiglio più utile che ho è quello di metterti in uno stato in cui puoi eseguire il codice C il più rapidamente possibile - cioè avviare, impostare le tabelle dei descrittori e arrivare a un punto in cui è sicuro eseguire compilato C. La maggior parte se non tutto il kernel dovrebbe essere in C se vuoi rimanere sano di mente e continuare a lavorarci su. L'assemblaggio, sebbene richiesto in alcuni punti, è noioso e tende a essere difficile da eseguire il debug.

Al suo livello più basso il minimo che un sistema operativo deve essere in grado di fare è guidare l'hardware di un sistema in qualche modo e in qualche modo caricare eseguire una sorta di "codice utente". Se inizi con un PC, devi scrivere il codice che può essere caricato da un dispositivo o un altro. I PC meno recenti dispongono di un BIOS nel firmware che determina il modo in cui l'hardware esegue l'inizializzazione (almeno video, tastiera e una qualche forma di memoria o caricatore di avvio). (Aggiornamento ottobre 2017: i PC più recenti hanno firmware EFI o UEFI ... che è in gran parte una differenza pedante; servono gli stessi scopi per questa discussione).

Quindi inizia imparando i dettagli di basso livello su come usare il BIOS o altri firmware, sul tuo sistema di destinazione. Cioè, impara come scrivere un programma che il BIOS può caricare ed eseguire. Questo finirà per trasformarsi nel tuo boot loader. Inizia in piccolo. Basta avere un programma che stampa: " Ciao, Linus " direttamente dal processo di avvio del firmware (su un floppy o una chiavetta USB, sarebbe un buon inizio ... o su un disco rigido, se lo desideri).

Da lì consiglierei di scrivere un driver seriale molto semplice ... aggiorna il tuo boot loader per inizializzare una porta seriale e iniziare un download da lì. Quindi può eseguire il codice che attraversa. Da lì scrivi un po 'di bootstrap che può scrivere su un altro set di blocchi (non abbiamo ancora implementato un file system ... nemmeno l'analisi della tabella delle partizioni; quindi all'inizio dovremmo occuparci solo di intervalli di blocchi grezzi sul disco ).

A quel punto il tuo boot loader dovrebbe essere in grado di estrarre il nuovo codice attraverso la linea seriale, scaricarlo in una partizione (sì, implementare una gestione della tabella delle partizioni di qualche tipo ... se è conforme alle convenzioni standard del PC dipende da te a questo punto) ed eseguirlo.

Da lì dovresti essere in grado di lavorare su funzionalità molto più sofisticate. Da questa base puoi scrivere e compilare un nuovo " kernel " ... riavvia il tuo banco di prova e fai distribuire il nuovo kernel su di esso.

(Il tuo bootloader dovrebbe prendere un segnale, come un BREAK sulle linee di handshaking seriale come comando per saltare il download e semplicemente avviare l'immagine esistente; e dovrebbe anche gestire un po 'di timeout in questo modo).

Da lì scrivi un livello terminale molto semplice e la shell dei comandi? Un filesystem? Implementare i comandi per scaricare nuovi contenuti eseguibili diversi dal kernel (file o oggetti di qualche tipo). E così via.

Ovviamente avresti potuto iniziare con un driver di console usando la tastiera e il video del PC (le cose BIOS INT 0x16h e INT 0x10H, rispettivamente, se ricordo bene). Tuttavia, suggerirei di iniziare con un driver seriale poiché è quindi possibile automatizzare il ciclo di generazione / distribuzione / test da qualsiasi altro sistema (funzionale) esistente. Dal momento che il tuo nuovo sistema operativo inizierà come progetto cross-compilato, sarà essenziale per te avere un modo semplificato di gestirlo.

Non so fino a che punto vuoi portare il tuo progetto. Un obiettivo ragionevolmente impressionante sarebbe quello di raggiungere "l'hosting automatico". Se riesci a creare un semplice assemblatore / compilatore che ti consenta di utilizzare il tuo nuovo sistema operativo per (ri) costruire, collegare e avviare una versione funzionante del tuo nuovo sistema operativo ... allora hai raggiunto questo obiettivo. (Nota che non è un requisito. Molti sistemi embedded non saranno mai self-hosting e non c'è nulla di sbagliato in questo).

Se non ti dispiace usare la virtualizzazione hardware, c'è un corso (libro + lezioni + software) che ti porterà "Da Nand a Tetris". Si crea un sistema informatico completo interamente dal gate NAND elettrico (per questi scopi atomico e dato), fino alla costruzione del sistema operativo, una lingua e infine alla codifica di un semplice gioco sul proprio computer personale.

Penso che sia un'ottima idea e qualcosa su cui intendo rimanere completamente bloccato presto. Il libro è sorprendentemente economico e credo che il corso sia tenuto al MIT. Non riesco a immaginare una sensazione più grande di avere la piena e completa conoscenza di un intero sistema che hai costruito da zero.

Link: http://www1.idc.ac.il/tecs/

Vorrei iniziare in piccolo e acquistare un kit di sviluppo integrato 8086 e sviluppare un sistema operativo multitasking su questo. Una volta che hai un kernel e hai familiarità con il lavoro a livello hardware, sarai pronto a fare qualcosa di più impegnativo.

Costruire anche un clone DOS con display VGA è una cosa abbastanza impegnativa. I dettagli sono enormi. : -)

argomenti specifici.

Come posso inserire il codice sul computer? È meglio farlo con un floppy disk? La maggior parte dei computer può farlo da una chiavetta USB?

Il BIOS eseguirà il bootstrap elementare.


Di quali driver ho bisogno e puoi suggerire qualche riferimento per costruirli?

tutto ciò che non è operazioni dirette cpu / memory. Tutto ciò che non è direttamente nel manuale di riferimento della CPU.


Dopo la sequenza di avvio - e allora? Come posso accedere alla modalità protetta ecc.

La modalità protetta farà parte della sequenza di avvio.

quindi inizi il multitasking e scopri come avviare i processi.


Come posso gestire la memoria senza l'aiuto di un sistema operativo? Uso solo gli indirizzi che desidero? Nessuna inizializzazione necessaria?

Una corretta. Probabilmente vorrai risolvere un sistema di memoria virtuale alla fine.


Cosa incontrerò senza dubbio per confondermi?

non avere strumenti di debug, non avere IO


Come posso renderlo una riga di comando O / S e una grafica?

Con dolore. Cerca Windows 3.1 e Linux, in particolare X windows.


Su cosa si basa un O / S grafico? Come, come farei qualcosa del genere, una riga di comando, con un carattere e un'immagine in alto?

Cerca X windows.


consiglio finale: studia linux / x windows. Non è perfetto, ma fornisce una comprensione dell'approccio uno . Studia anche sistemi integrati.

Vedo molti buoni riferimenti ai siti di sviluppo del sistema operativo, quindi descriverò un approccio diverso:

Se vuoi l'esperienza di implementazione di un sistema operativo da bare metal, ci sono scelte hardware decisamente migliori rispetto a un vecchio PC. Con l'architettura PC, trascorrerai una quantità eccessiva del tuo tempo a codificare artefatti poco interessanti della sua storia del design di 30 anni. Ad esempio, solo la parte del bootloader del progetto ha probabilmente bruciato molti programmatori coraggiosi.

Ad esempio, avrai bisogno di un set di driver per leggere il tuo kernel dal disco e / o dalla rete. Quindi avrai bisogno di codice per entrare in modalità protetta. A quel punto, hai bisogno di un altro set di driver! Molto poco del lavoro che fai per portare il chip in modalità protetta sarà trasferibile dopo quel punto. Vuoi eseguirlo su un altro PC + - 4 anni e avrai bisogno di un altro set di driver.

Guarda il bootstrap di un ARM o di un altro "incorporato" a 32 bit " patata fritta. Sono disponibili schede di sviluppo economiche o puoi saldare le tue! Alcuni hanno Ethernet e USB integrati. Penso che ti divertirai di più lavorando su un'architettura sana e non crosta, e forse finirai con alcune abilità riutilizzabili.

Più di ogni altra cosa, se vuoi che funzioni su hardware reale, hai assolutamente bisogno di una copia del manuale del tuo processore. I manuali Intel ( http://www.intel.com/products/processor/manuals/) sono inestimabili. Passano di tutto, dalle modalità di commutazione (reale / protetta) alla gestione della memoria virtuale (se si sceglie di andare così lontano) alla creazione di syscall (se mai si arriva alla modalità utente). Soprattutto spiegano in dettaglio una serie di cose che devono essere configurate affinché le cose funzionino, come i registri TSS e dei segmenti, che la maggior parte dei testi del sistema operativo non discute perché sono più interessati concetti di livello superiore rispetto ai dettagli specifici del processore.

Le Serie di sviluppo del sistema operativo @ BrokenThorn potrebbero interessarti.

Prova a leggere il codice di un piccolo sistema operativo open source di base, come MikeOS.

In alternativa, suggerisco i seguenti passaggi (dovrebbe essere divertente!):

  1. Scrivi una macchina virtuale. Definire tutte le istruzioni del processore in modo da conoscere il sistema dentro e fuori. Interfaccialo con SDL per tastiera, mouse, schermo, accesso audio. Renderlo semplice in modo da poter adattare tutto in testa in una volta. Non deve essere una macchina virtuale all'avanguardia, ma solo una che può emulare la funzione di un computer "reale".
  2. Scrivi un assemblatore per il processore della tua macchina virtuale. Ricorda che questo assemblatore non deve necessariamente essere un programma scritto nel linguaggio della macchina virtuale, ma tutto ciò che può convertire il tuo linguaggio assembly in codice macchina.
  3. Definisci un formato eseguibile e scrivi un semplice linker.
  4. Adesso hai tutte le parti per scrivere il tuo sistema operativo! Scrivilo nel linguaggio assembly, assemblalo ... ecc. Non hai bisogno di un processo di bootload così complicato, devi solo far funzionare prima il tuo sistema operativo.

I passaggi precedenti possono sembrare un po 'stupidi per scrivere un sistema operativo semplice, ma ehi, è dannatamente divertente.

controlla MikeOS . È un sistema operativo abbastanza semplice scritto è leggibile (come in commento) assembly. Anche se è abbastanza semplice, ha una GUI e supporta alcune reti e contenuti multimediali.

modifica : MenuetOS è grafico. È anche scritto, ma è più sofisticato di MikeOS

Hai un obiettivo ambizioso. Ma l'esecuzione è la chiave.

La maggior parte degli approcci strutturati (libro di testo o classe universitaria) ti guiderà attraverso il processo, ma forniscono molto del codice nitido che lucida sui dettagli arcani della tua piattaforma scelta e ti consente di concentrarti sul grande- idee immagine: pianificazione dei processi, gestione della memoria, prevenzione dei deadlock, I / O e così via.

Il mio consiglio è questo: riduci le tue aspettative e inizia con una domanda di base.

Che cos'è un sistema operativo?

Un informatico (si spera) non dirà mai che un sistema operativo è un'interfaccia utente grafica, o un browser Web, o un modo per collegare dispositivi USB o qualsiasi cosa che un utente possa effettivamente vedere o toccare. Invece, un sistema operativo al suo livello più fondamentale sono quelle cose che ho menzionato sopra. Tutti rientrano in un unico grande ombrello: la gestione delle risorse.

Un sistema operativo non è altro che un programma che gestisce le risorse hardware del computer: memoria, CPU e periferiche.

Ecco un semplice sistema operativo: un programma consente all'utente di digitare un programma (in esadecimale o binario) utilizzando una connessione seriale. Dopo aver digitato il programma, esegue il programma. Al termine del programma, il controllo viene restituito all'utente dove è possibile eseguirlo nuovamente o digitarne uno nuovo.

Fallo su un " clean " architettura come un processore ARM incorporato con 64 KB di memoria o giù di lì. È possibile codificarlo in assemblea dopo alcuni giorni di apprendimento dei dettagli di ARM. E voilà! , hai un sistema operativo.

Fa tutto ciò che un SO dovrebbe fare:

  • Gestisce la memoria impedendo all'utente di sovrascrivere il sistema operativo stesso.
  • Pianifica l'esecuzione di un singolo processo.
  • Gestisce l'I / O sulla singola periferica seriale.

Questo ti dà un blocco da cui partire. Hai molte scelte ora. Forse uno di questi sarebbe consentire il caricamento in memoria di due programmi e consentire all'utente di decidere quale eseguire successivamente.

Oppure potresti consentire all'utente di sospendere l'esecuzione di un programma, passare all'altro, sospendere e tornare indietro. Questo è un multitasking rudimentale, anche se è interamente manuale.

Le tue scelte sono illimitate ma ognuna è un piccolo passo da ciò che avevi prima.

È divertente se non si punta troppo in alto!

Mantengo un elenco di risorse su StackOverflow: Come iniziare nello sviluppo del sistema operativo . Ti preghiamo di aggiungere nuove risorse mentre inizi la tua avventura (sto per iniziare :))

Molte scuole hanno classi OS che fanno molto di ciò che descrivi. La mia scuola (CMU) ha insegnato OS in C e abbiamo scritto un kernel, un file system e una shell e ci è stato fornito il codice per un boot loader.

Sfortunatamente, non sono stato in grado di trovare alcuna risorsa definitiva per questo corso (15-412) sul Web, e si è evoluto nel tempo. Ma forse le persone potrebbero pubblicare collegamenti a fonti e incarichi per le scuole che dispongono di buone risorse sul web.

Potresti divertirti questo tutorial chiamato " Rotola il tuo giocattolo UNIX -clone OS " ;, è molto approfondito e dovrebbe aiutarti sulla tua strada.

Buona fortuna.

Studia il Sistema A2 (precedentemente chiamato sistema Oberon ) per idee che puoi rubare. È un sistema operativo grafico creato da sole due persone, anche se è vero che uno è Niklaus Wirth. Rilasciato per la prima volta intorno al 1990 e la velocità è sorprendentemente buona. C'è un libro di Gutknecht.

Informazioni sulla programmazione grafica di basso livello, questo ti darà molte informazioni: http: / /www.osdever.net/FreeVGA/home.htm . (È molto interessante anche per la modalità testo.)

  

Cosa incontrerò senza dubbio per confondermi?

Ti renderai conto che su PC ci sono moltissime cose poco chiare: il set di istruzioni x86 stesso è complicato e quando si ottiene l'accesso diretto all'hardware, può passare un po 'di tempo prima di capire come scrivere un singolo personaggio sullo schermo.

Non preoccuparti del floppy disk e simili, il più delle volte utilizzerai un emulatore come Bochs o QEmu.

Potresti prendere in considerazione la possibilità di dare un'occhiata a Concetti relativi ai sistemi operativi, di Abraham Silberschatz - Comprendere i concetti di programmazione dei sistemi è un requisito fondamentale, dare un'occhiata ai interni del kernel F / OSS dei sistemi operativi Linux * BSD e GNU / Linux , in particolare le versioni precedenti, che sono probabilmente un po 'più documentate.  alt text alt text

Dai un'occhiata a Minix . Studia il codice sorgente insieme a " Progettazione e implementazione di sistemi operativi " ;. Prendi in considerazione l'idea di dare un contributo al progetto. Penso che Minix sia davvero un buon sistema operativo promettente. È anche un progetto ben finanziato. Ciò significa che potresti anche essere pagato per i tuoi contributi!

È molto semplice grazie al fatto che nel BIOS sono già integrate molte funzioni di input / output per cambiare la modalità dello schermo, cambiare il colore dei pixel, scrivere il testo sullo schermo e molte altre cose. Tuttavia, non include il supporto per i file system, questa è una delle pochissime cose che devi incorporare nel tuo sistema operativo.

Il BIOS carica il primo settore sul disco rigido e inizia a eseguire il codice da lì, quindi il tuo sistema operativo deve essere posizionato con la prima istruzione nel primo settore sul disco rigido.

Questo articolo di Wikipedia dovrebbe iniziare sugli interrupt del BIOS per la scrittura di testo sullo schermo, la ricezione di tasti dalla tastiera e altro. https://en.wikipedia.org/wiki/BIOS_interrupt_call

Anche se hai intenzione di usare c ++, ti consiglio vivamente di leggere sulla programmazione degli assembly, poiché è fondamentale capire come funziona l'hardware.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top