Emulazione di Linus Torvalds: crea il tuo sistema operativo da zero (VII)

Benvenuto in un altro post su come creare il nostro sistema operativo (Articoli precedenti della serie: 1, 2, 3, 4, 5 y 6). È passato molto tempo dall'ultimo post, principalmente a causa di un bug che ho trovato in quello che abbiamo oggi. Vedremo come gestire l'orologio su architetture x86.

In precedenza avevamo attivato gli IRQ in modo generico, ma c'era un piccolo problema poiché non li attivavamo correttamente e passavamo dati extra. Finalmente lo sistemiamo carlosorta e io e io possiamo continuare a commentare come continuare.

Bene, l'orologio è un IRQ, in particolare il primo. Per configurarlo, useremo la funzione che abbiamo definito sopra per installare genericamente gli IRQ, il ND_IRQ_InstallHandler.

int ND_TIMER_TICKS = 0; void ND :: Timer :: Phase (int hz) {int divisore = 1193180 / hz; ND :: Porte :: OutputB (0x43,0x36); ND :: Porte :: OutputB (0x40, divisore e 0xFF); ND :: Porte :: OutputB (0x40, divisore >> 8); } void ND :: Timer :: Wait (int ticks) {unsigned long eticks; eticks = ND_TIMER_TICKS + tick; while (ND_TIMER_TICKS <eticks) {void ND :: Timer :: Setup () {ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BLACK); ND :: Screen :: PutString ("\ nSetup timer ..."); ND_IRQ_InstallHandler (0, & ND_Timer_Handler); ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_GREEN); ND :: Screen :: PutString ("done"); } extern "C" void ND_Timer_Handler (struct regs * r) {ND_TIMER_TICKS ++; if (ND_TIMER_TICKS% 18 == 0) {// ND :: Screen :: SetColor (ND_SIDE_FOREGROUND, ND_COLOR_BROWN); // ND :: Screen :: PutString ("\ nUn altro secondo"); DOBBIAMO FARE UNA SCHERMATA DI AGGIORNAMENTO}}

Il codice viene eseguito come segue: il sistema di inizializzazione chiama ND :: Timer :: Setup, che chiama ND_IRQ_InstallHandler per inserire nella prima posizione, l'IRQ0, una funzione di callback quando si verifica l'evento, cioè ND_Timer_Handler che aumenta il zecche. Dato che abbiamo impostato la velocità di clock a 18 Hz, come vedremo più avanti, se la dividessimo per 18 e ci dessimo un numero intero, sarebbe passato un secondo.

La funzione ND :: Timer :: Fase Ci aiuta a regolare la velocità del timer, quel numero stravagante è 1.19 MHz che è un valore comune. Bene, dovremmo chiamare questa funzione se vogliamo cambiare la velocità del file timer, di default va a 18,22 Hz, un valore peculiare che qualcuno deve aver deciso entro IBM ed è rimasto fino ad oggi.

La funzione ND :: Timer :: Attendi è piuttosto semplice, aspetta solo con un ciclo while fino al zecche necessario per continuare.

Nell'immagine possiamo vedere che se rimuoviamo il commento dal codice all'interno di ND_Timer_Handler otteniamo questo:

Secondi in NextDivel

Nel prossimo capitolo vedremo come leggere l'input da tastiera e fare un po ' conchiglia per interagire con il nostro sistema. Come sempre, il codice È disponibile in GitHub sotto la licenza GNU GPL v2.


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   Noè suddetto

    Serie di tutorial molto interessanti, personalmente non ne avevo visti molti sulla creazione di una distribuzione Linux da zero, e ancor meno in spagnolo e quindi completa. Penso che tu possa imparare molto da questo e appena avrò tempo spero di poter fare questi tutorial.
    Tutto quello che ti chiedo è di non scoraggiarti e finire il tutorial, poiché ho trovato molti buoni tutorial che non sono mai finiti.
    Saluti e grazie :).

    1.    vagabondo suddetto

      Non è una distribuzione Linux, è un kernel 😛.

    2.    desikoder suddetto

      Hai torto. Creare una distribuzione Linux non implica programmare nulla, ad esempio, in un Linux da zero non si programma, quello che si fa è installare (basato sulla compilazione), pacchetti di base che compongono una distro. Questo è molto diverso. Sta creando il tuo sistema operativo. Non ha niente a che fare con Linux. Questo è ciò che ha fatto Torvalds ai suoi tempi ispirato da Minix, e con quell'accesa e popolare discussione tra Torvalds e Andrew S. tanenbaum su kernel monolitico vs microkernel.

      Saludos!

  2.   illukki suddetto

    Grazie che. Fino ad ora non ho prestato molta attenzione ai tuoi post ma sono in un progetto quindi ho intenzione di dargli un'occhiata.
    Saluti.

  3.   vagabondo suddetto

    Vale la pena ricordare che possono essere utilizzati altri linguaggi, come Objective-C (++), C ++, D o Rust.

    1.    AdrianArroyoStreet suddetto

      Questo è in C ++, non C. Tuttavia, è difficile vedere le differenze poiché molti operatori C ++ richiedono un supporto di libreria, come gli operatori new e delete. Sarebbe molto interessante creare un sistema operativo in Rust. In realtà c'è un canale IRC dedicato ai sistemi operativi su Rust (# rust-osdev su irc.mozilla.net). Ne vale davvero la pena chiunque compili in codice macchina, compreso Java se usiamo GCJ.

      1.    vagabondo suddetto

        Sì, in effetti, Rust è un linguaggio molto interessante per i sistemi operativi, perché non solo è più facile da imparare rispetto al C o al C ++ (continua ancora con continui cambiamenti, ma è più facile), ma è molto più sicuro.

  4.   vagabondo suddetto

    Negli anni '70 era abbastanza comune programmare direttamente sull'hardware, senza OS.

  5.   Christopher suddetto

    Eccellente ... ora devo solo capire: 3 ...

  6.   mmm suddetto

    Ciao. Grazie mille per questi articoli. Ma se non ho conoscenze di programmazione, non penso che dovrei farlo, giusto? Insomma, se no sarebbe un "bravo, e adesso cosa copio e incollo?" ... che peccato, ho sempre voluto sapere programmare tanto e niente, sono più un asino!

    1.    desikoder suddetto

      Non incolpare te stesso, non sei un asino. Per cominciare, non tutti i programmatori sanno come scrivere un kernel, è un compito molto piccolo e semplice, e in pratica è più grande. Ad esempio qui l'autore crea driver generici per la tastiera e lo schermo, manipolando l'array dello schermo, che è un metodo che oggi non viene utilizzato affatto. Le tty in Linux oggi sono molto, molto complesse e non dipendono dall'architettura x86 che dispone di uno screen array. Inoltre, gran parte del codice in C dipende dall'architettura, quando l'ideale è creare il codice dell'architettura in assembler e che il codice C funzioni su qualsiasi processore. Comunque non distolgo l'autore, perché un kernel acquisisce le caratteristiche che oggi consideriamo normali in un kernel linux, ad esempio, non è un compito facile, e state certi che una sola persona è assolutamente incapace di farlo. Per qualcosa i grandi progetti come linux, gcc, glibc, ecc., Non sono fatti da una sola persona ma ci sono molti collaboratori.

      Inoltre, se vuoi iniziare a programmare, hai un bel po 'di guide sul web, anche se devi stare attento e selezionare le buone guide. Ho iniziato a programmare in linux saltando in piscina con la testa e senza acqua (cioè con l'amato linguaggio C), anche se ora ho alcune nozioni di base di python (che è anche un ottimo linguaggio). Ci sono alcuni libri di C in cui rinunci a pagina 6 tanto del mal di testa che ricevi, ma più che libri queste cose vengono acquisite dall'esperienza. Succede come con il modello di rete OSI. La documentazione sul modello osi è assolutamente impossibile da capire per il nuovo arrivato, ma se trovi un sito con una buona spiegazione dei livelli di rete, ottieni rapidamente i concetti per trattare documenti tecnici come RFC.

      In breve, ci sono buoni siti web e manuali là fuori, è questione di scendere e trovare del buon materiale.

      saluti

  7.   La libertà suddetto

    Ciao, dopo tutti i tentativi di risolvere "errore: nessuna intestazione multiboot trovata". e «errore devi prima caricare il kernel», dato che non sono riuscito a trovare da nessuna parte la soluzione al problema del primo articolo, che alcuni come me avevano ... ecco la soluzione, se per qualcuno funziona ...

    Non so se la mia teoria sulla causa dell'errore sia corretta ma comunque la domanda è che durante la compilazione dei file in un sistema operativo a 32 bit, non ha generato l'errore, ma dato che ho un funzionamento a 64 bit sistema (Gnu / Linux Debian 7) e che durante la compilazione e il test ho lanciato l'errore "no multiboot header found", e c'è un dubbio, quindi a mio parere l'errore è dovuto all'ambiente o all'architettura del sistema operativo in cui stiamo compilando i nostri file ... e beh quello che ho fatto è compilare i miei file, specificando l'ambiente o l'architettura a 32 bit ..
    * sudo come -o kernel.o -c kernel.asm -32
    * sudo gcc -o NextKernel_Main.o -c NextKernel_Main.c -nostdlib -fPIC -ffreestanding -m32
    * sudo gcc -m32 -o START.ELF kernel.o NextKernel_Main.o -Tlink.ld -nostdlib -fPIC -ffreestanding
    La cosa strana è che ho qualche dubbio hahaha, quindi il sistema operativo che stiamo creando passo dopo passo è per un'architettura x86 o mi sbaglio ajajaj….

    PS: qualcuno che mi aiuti con il dubbio e che scusi alcuni errori di ortografia o la mia cattiva espressione, e beh non sono perfetto quindi «La perfezione ha il suo prezzo» .... E soprattutto, emuli un sistema operativo a 32 bit, santa soluzione … .Hahaha

    1.    Martino Villalba suddetto

      Genio! Volevo davvero fare questo tutorial e all'inizio sono arrivato con quell'errore ahah

  8.   Oscar suddetto

    Congratulazioni, è un ottimo contributo. D'ora in poi condivido con voi che il vostro buon lavoro attraverso me e gli altri sarà esteso;

    saluti