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

17

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

Ho 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 un kernel funziona effettivamente da una prospettiva di programmazione. Ho passato ore a sfogliare il codice del kernel di Linux, ma questo può solo portarti fino a qui.

Quali sono i passaggi di base nella costruzione di un kernel? Cose che devi affrontare? Ordinare o fare cose? So che sto tagliando molto, ma sono determinato a gestirlo.

    
posta n0pe 16.06.2011 - 19:13
fonte

5 risposte

33

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 ritieni debbano essere migliorati?

Se non sei impostato come UNIX, alla fine rispondi anche a più domande: i processi devono 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? Che livello di isolamento vuoi fornire tra le attività? Dove vuoi che cada sulla scala monolitica vs. micro-kernel? Fino a che punto (se esiste) vuoi supportare l'operazione distribuita?

In genere consiglio contro di studiare il kernel Linux per la tua ispirazione. Questo non è niente contro il kernel di Linux stesso, ma un semplice fatto che Linux è destinato principalmente all'uso di produzione, non all'educazione. Ha un sacco di ottimizzazione, hack di compatibilità con le versioni precedenti, ecc., Che sono estremamente utili per la produzione, ma con maggiori probabilità di distrarre rispetto all'educazione.

Se riesci a trovarlo, una copia del libro di Lion ( Commentario dei Lions su UNIX 6th) L'edizione , con codice sorgente , di John Lions) è un punto di partenza molto più semplice. La sesta edizione UNIX era ancora piccola e abbastanza semplice da leggere e capire abbastanza velocemente, senza essere un sistema giocattolo troppo semplificato.

Se hai intenzione di indirizzare l'x86 (almeno in primo luogo) potresti anche voler dare un'occhiata a MMURTL V 1.0 di Richard Burgess. Questo presenta un sistema per x86 che usa l'hardware x86 molto di più come i progettisti della CPU inizialmente intendevano - qualcosa che i sistemi più reali si rifiutano di privilegiare la portabilità ad altre CPU. Come puoi immaginare, questo tende ad essere orientato molto più pesantemente verso la fine dell'hardware delle cose. Le copie stampate sembrano costose e difficili da trovare, ma puoi scaricare gratuitamente il testo e il codice .

Fortunatamente, ci sono anche molte altre possibilità - Progettazione e implementazione del sistema operativo , ad esempio da Andrew Tanenbaum e Albert Woodhull.

    
risposta data 16.06.2011 - 19:40
fonte
12

Suggerirei di iniziare con un compito minuscolo e altamente focalizzato: usando l'assembly, scrivi un programma di bootstrap per giocattoli. Non deve fare molto. Vorresti solo che il computer caricasse automaticamente il programma all'avvio, stampi un messaggio che confermi che è in esecuzione, leggi alcuni input dalla tastiera, stampa un altro messaggio, quindi spegni il computer.

Questo avrebbe diversi vantaggi:

  1. Alla fine avrai bisogno di un processo di bootstrap per il tuo kernel, quindi è così non sarà inutile esercizio.
  2. Ti insegnerà a scrivere in assemblaggio.
  3. Darà alla tua pratica la scrittura di routine IO di basso livello. Come si scrive un messaggio sullo schermo o si legge una sequenza di tasti quando non ci sono sistemi operativi per i quali si può effettuare una chiamata?
  4. Ti farà fare esperienza ricerca sulle minuzie tecniche di la CPU e la scheda madre. (Primo domanda: come fa il tuo scheda madre / CPU trovare un avviabile programma quando inizia?)
  5. Scrivere i kernel è diventato un compito molto sofisticato, con un sacco di sottigliezze. Questo compito ti darà qualcosa da fare inizia con e forse ti impedisce di perdersi tra le erbacce prima ancora di iniziare.

Una volta che puoi fare ciò, avrai un'idea molto migliore di quello che stai provando.

    
risposta data 16.06.2011 - 20:23
fonte
7

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

Leggere un buon libro come Operating System Concepts sarebbe un buon inizio per progettare il proprio kernel. Dovrai gestire il caricamento all'avvio, la gestione dei driver del dispositivo, l'interfacciamento con il BIOS, la creazione e la gestione del file system, la programmazione del programma, il caricamento e lo scaricamento del programma, implementare almeno una sorta di shell (molto più facile quindi costruire un sistema di finestre). p>

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

Questo non inizia nemmeno a pensare al multithreading, alla sicurezza del sistema, alla rete.

    
risposta data 16.06.2011 - 19:21
fonte
7

Minix è un bel clone Unix (che ha ispirato Linux) che è stato scritto per l'insegnamento.

Andrew S. Tannenbaum è un eccellente scrittore e insegnante e ha scritto un intero libro sui sistemi operativi usando Minix come esempio (e include il codice sorgente da seguire): link

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

Posso strongmente raccomandare di considerare questo come una risorsa di apprendimento. Vi darà anche un'idea della quantità di lavoro necessaria per produrre effettivamente qualcosa che può effettivamente essere utile.

    
risposta data 16.06.2011 - 20:49
fonte
4

L'ho imparato anche io. Puoi controllare queste risorse. Sono molto bravi!

link

link

Divertiti lungo il cammino!

    
risposta data 30.01.2012 - 06:10
fonte

Leggi altre domande sui tag