Consigli per uno studente ambizioso sulla costruzione del proprio kernel [chiuso]


18

Sono uno studente universitario molto ambizioso che desidera imparare praticamente tutto ciò che c'è da sapere sui computer (bashmi se vuoi, adoro imparare). Recentemente ho pensato che sarebbe stato un progetto divertente (anche se lungo) per progettare e costruire il mio kernel.

Ho avuto alcune informazioni di base e ho capito che ho bisogno di padroneggiare Assembly e C / C ++ per farlo funzionare davvero. Mentre sto lavorando su quelli, mi piacerebbe imparare come funziona un kernel dal punto di vista della programmazione. Ho passato ore a sfogliare il codice del kernel linux ma questo può solo portarti lontano.

Quali sono i passaggi di base nella creazione di un kernel? Cose che devi affrontare? Ordina o fai cose? So che mi sto mordendo molto, ma sono abbastanza determinato da gestirlo.


12
Non c'è bisogno di colpirti per voler imparare tutto. Ma se hai intenzione di provare davvero, è meglio che tu abbia prolungato la durata della vita, un cervello sovrumano e nessun altro piano per la tua vita;)

2
Mi aspetto di averli tutti! Non proprio, però, ho solo un enorme bisogno di imparare.
n0pe

@delnan La possibile schizofrenia paranoica è anche un vantaggio: templeos.org
DanteTheEgregore

@DanteTheEgregore What the?
Panzercrisis,

Risposte:


34

Quello che devi fare è progettare il sistema operativo. Anche se, ad esempio, decidi che dovrebbe essere un sistema simile a UNIX, ci sono ancora molte decisioni da prendere. Quanto vuoi che sia UNIX? Quali parti di UNIX ti piacciono e quali pensi che necessitino di miglioramenti?

Se non hai intenzione di renderlo simile a UNIX, finisci con ancora più domande a cui rispondere: i processi dovrebbero formare un albero o sono "piatti"? Che tipo di comunicazione tra processi vuoi supportare? Vuoi che sia multiutente o solo multi-tasking (o possibilmente single-tasking)? Vuoi che sia un sistema in tempo reale? Quale grado di isolamento vuoi fornire tra le attività? Dove vuoi che cada sulla scala monolitica vs. micro-kernel? In che misura (se ce ne sono) vuoi che supporti le operazioni distribuite?

Mi piacerebbe in genere consiglio contro lo studio del kernel di Linux per la vostra ispirazione. Questo non è nulla contro il kernel Linux stesso, ma un semplice fatto che Linux è destinato principalmente all'uso in produzione, non all'istruzione. Ha un sacco di ottimizzazioni, hack di compatibilità con le versioni precedenti, ecc., Che sono estremamente utili per la produzione ma hanno maggiori probabilità di distrarre che educare.

Se riesci a trovarlo, una copia del libro di Lion ( Lions 'Commentary on UNIX 6th Edition , con codice sorgente , di John Lions) è un punto di partenza molto più semplice. 6ª Edizione UNIX era ancora abbastanza piccolo e semplice da leggere e capire abbastanza rapidamente, senza essere un sistema di giocattoli semplificato.

Se stai pensando di scegliere come target x86 (almeno principalmente) potresti anche voler guardare MMURTL V 1.0 di Richard Burgess. Questo presenta un sistema per x86 che utilizza l'hardware x86 molto più come previsto inizialmente dai progettisti di CPU, qualcosa che la maggior parte dei sistemi reali evita a favore della portabilità verso altre CPU. Come puoi immaginare, questo tende ad essere orientato molto più pesantemente verso la fine hardware delle cose. Le copie stampate sembrano essere costose e difficili da trovare, ma puoi scaricare il testo e il codice gratuitamente.

Fortunatamente, ci sono anche molte altre possibilità: la progettazione e l'implementazione del sistema operativo , ad esempio di Andrew Tanenbaum e Albert Woodhull.


Caspita grazie per la bella risposta. Esaminerò tutti quei libri.
n0pe

7
Ho aggiunto collegamenti ai PDF del libro e della fonte. La cosa sorprendente della fonte per v6 UNIX è che è lunga 100 pagine, con 100 righe per pagina. E in 10.000 righe di codice hai un sistema operativo completo e multitasking . Se riesci davvero a capire il codice che circonda il famoso commento alla riga 2238, "Non ti aspetti di capirlo", puoi darti una stella d'oro e un master onorario. Godere!
Peter Rowell,

Grazie per i collegamenti! Ora devo capire dove stamparlo ....
n0pe

1
Minix (il libro di Tannenbaum) è progettato per l'istruzione e potrebbe essere proprio quello che serve qui.

@PeterRowell, dmr ha dichiarato che si trattava di un bug in cm.bell-labs.com/who/dmr/odd.html

12

Suggerirei di iniziare con un compito minuscolo e altamente focalizzato: usando assembly, scrivi un programma bootstrap giocattolo. Non deve fare molto. Vuoi solo che il computer carichi automaticamente il programma all'avvio, stampa un messaggio che conferma che è in esecuzione, leggi alcuni input dalla tastiera, stampa un altro messaggio e quindi spegni il computer.

Ciò avrebbe diversi vantaggi:

  1. Alla fine avrai bisogno di un processo bootstrap per il tuo kernel, quindi non sarà un esercizio inutile.
  2. Ti darà pratica per iscritto in assemblea.
  3. Darà la tua pratica nello scrivere routine IO di basso livello. Come si scrive un messaggio sullo schermo o si legge una sequenza di tasti quando non c'è un sistema operativo per cui si può chiamare?
  4. Ti darà esperienza facendo ricerche sulle minuzie tecniche della CPU e della scheda madre. (Prima domanda: in che modo la scheda madre / la CPU trova un programma avviabile all'avvio?)
  5. Scrivere kernel è diventato un compito molto sofisticato, con un sacco di sottigliezze. Questo compito ti darà qualcosa per cominciare e forse ti impedirà di perderti nelle erbacce prima ancora che inizi.

Una volta che puoi farlo, avrai un'idea molto migliore di ciò che stai entrando.


Grazie per questo, penso che sia esattamente quello che cercherò di fare. Altre letture nel mio futuro.
n0pe

7

Imparare a programmare in assemblatore è un buon primo avvio e farlo da MSDOS 6.0 potrebbe essere utile anche a causa della mancanza di funzionalità integrate.

Leggere un buon libro come Concetti del sistema operativo sarebbe un buon inizio per progettare il proprio kernel. Dovrai gestire il caricamento di avvio, la gestione dei driver di dispositivo, l'interfacciamento con BIOS, la creazione e la gestione del file system, la pianificazione dei programmi, il caricamento e lo scaricamento dei programmi, l'implementazione di almeno una sorta di shell (molto più semplice della creazione di un sistema a finestre).

C / C ++ funzionerà solo se il tuo kernel è compatibile con le librerie standard per queste lingue, altrimenti dovrai scrivere anche una copia di queste librerie.

Non sta nemmeno iniziando a pensare al multithreading, alla sicurezza del sistema, alla rete.


7

Minix è un bel clone di Unix (che ha ispirato Linux) che è stato scritto per insegnare.

Andrew S. Tannenbaum è un eccellente scrittore e insegnante e ha scritto un intero libro sui sistemi operativi che utilizzano Minix come esempio (e include il codice sorgente da seguire): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation

Personalmente trovo che sia in qualche modo uno scrittore migliore del programmatore, quindi alcune cose non sono così chiare come vorrei personalmente, ma - ehi - funziona!

Consiglio vivamente di esaminare questo come una risorsa di apprendimento. Ti darà anche un'idea della quantità di lavoro necessaria per produrre effettivamente qualcosa che può effettivamente essere utile.


Consiglierei di prendere il libro fisico. Più facile prendere appunti.

A dire il vero, penso di aver visto il libro su Amazon a buon mercato. Potrei farlo lì. Grazie
n0pe il

Si noti inoltre che questa è la terza edizione. Credo che abbiamo usato la prima edizione quando avevo il corso.

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.