OsDev - Lezione 1

  1. #1
    Utente Esperto L'avatar di d23
    Data Registrazione
    Dec 2013
    Messaggi
    337
    Prima lezione all'OsDev, spero vi piaccia. Potete trovare la OsFromScratch di Silvio Abruzzo qui
    Lezione tenutasi su irc.azzurra.org Venerdì 6 Maggio 2005 svolta da: BlackOS, WhiteOS


    Rielaborazione di d23 (io ahah)


    NB: Tutte le informazioni riguarderanno i processori x86 e compatibili


    Cos'è un Sistema Operativo?
    Il s.o. è un insieme di programmi che operano direttamente al di sopra della macchina fisica mascherandone le caratteristiche e fornendo agli utenti un insieme di funzionalità di alto livello.
    Fornisce all'utente un'interfaccia, una macchina astratta, virtuale, semplice da utilizzare.


    Per caricare un sistema operativo in ram abbiamo bisogno di un bootloader


    Cos'è un Bootloader?
    All’avvio di un computer nessun sistema operativo è ancora presente nella RAM poiché essa si azzera non appena l’alimentazione viene a mancare.
    Chi gestisce le primissime fasi di un computer appena avviato è il BIOS. Il Bios si trova in una paricolare memoria chiamata ROM - Read Only Memory.
    le prime funzioni che vengono effettuate sono una serie di test per controllare quali device sono presenti. Questa fase è di solito chiamata POST che sta per Power-On Self-Test, tutti i dispositivi riconosciuti vengono inizializzati, per non creare conflitti hardware.
    Ad ognuno di essi viene associata una porta di Input output e linee irq (interrupt request). Una volta compiute tutte queste operazioni il bios carica il primo settore del primo cilindro del dispositivo selezionato e inizia ad eseguire le istruzioni assembler presenti dall'indirizzo 0000:0x7C00.
    [ORG 0x7C00] l'indirizzo di partenza -> l'indirizzo 0x7c00 infatti indica proprio l' indirizzo del bootsector ovvero il primo settore che il bios carica.
    Le caratteristiche obbligatorie del bootloader sono:
    - non essere più grande di 512 byte
    - terminare con 0xAA55, una firma speciale che indica al BIOS la validità del programma di boot
    - iniziare usando la modalità reale quindi niente registri a 32 bit e istruzioni del pmode


    In sintesi il bootloader deve:
    1) caricare il kernel in memoria
    2) inizializzare la modalità protetta
    3) lanciare il kernel


    Ma cos'è la modalità protetta?
    La modalita' protetta è una particolare modalità di "lavoro" dei processori x86 e compatibili. Essa utilizza indirizzamenti a 32bit al contrario della modalità reale (quella base) che utilizza indirizzamenti a 16 bit.
    La modalità protetta fornisce particolari "funzioni" adatte per la gestione della memoria (ad esempio la paginazione hardware), del multitasking hardware, della protezione, e molto altro.
    L' unica pecca è che quando si è in modalità protetta non è possibile utilizzare gli interrupt bios che generalmente facilitano il lavoro, poiché essi lavorano in modalità reale a 16 bit.


    Ma cosa sono gli interrupt bios?
    Gli interrupt bios permettono con facilita' di gestire la stampa a video , di leggere settori del floppy ecc Essi sono gestiti come il nome puo suggerrire dal bios, sono segnali che interrompono "qualcosa". Vedremo a breve cosa.


    Ma cosa deve implementare un sistema operativo?
    - Funzioni per la stampa a video
    - Funzioni per la gestione degli interrupt
    - Funzioni per la gestione dei task(scheduler e funzione per la creazione di task)
    - Funzioni per la comunicazione interprocesso
    - Funzioni per la gestione della memoria(fisica e virtuale)
    - Funzioni per gestire la mutua esclusione(semafori, monitor )
    - Chiamate di sistema(system calls)
    - File System
    - Shell


    Siccome stiamo scrivendo un sistema operativo non abbiamo le librerie che comunemente usiamo, poiché appunto sono basate sul sistema operativo in uso, ma noi stiamo scrivendo un sistema operativo da 0, quindi dovremo scrivere anche quelle.


    Ad esempio la funzione per la stampa a video dovremo implementarla noi, ma come?
    esempio:
    Codice PHP:
        char *addr_videomem = (char *)0xb8000// creo un puntatore che punta all'indirizzo di memoria della scheda video
        
    char carattere 'b';
        
    int colore=0xF0;    //colore: nero su bianco
        
    *videomem++ = carattere;    // imposto il carattere
        
    *videomem++ = colore;    // imposto gli attributi del carattere 

    Interrupt
    Un Interrupt come dice il nome stesso è un interruzione che arriva dal processore.
    Quando si verifica un interrupt le operazioni da eseguire sono:
    1) Sospendere l' esecuzione corrente(ad esempio di un programma)
    2) Chiamare la funzione che gestisce l' interrupt arrivato (questa funzione prende il nome di handler o ISR)
    3) Ripristinare lo stato come era prima dell' arrivo dell' interrupt (ad esempio continuare l' esecuzione del programma da dove lo si era sospeso)


    Un esempio di interruzione si verifica quando si preme un tasto della tasiera.
    Quando si preme un tasto bisogna:
    1) sospendere l' esecuzione corrente
    2) chiamare la funzione che gestisce la keyboard stampando il carattere digitato a video
    3) ripristinare lo stato precedente all' interrupt


    Gestione dei task
    Un task è un programma caricato in memoria e un sistema operativo multasking deve saper decidere quale task mandare in esecuzione. Qui entra in gioco lo scheduler che attraverso diversi algoritmi decide quale task eseguire.
    In generale lo stato di un processo è:
    - READY se è pronto per l' esecuzione
    - RUNNING se è in esecuzione
    - BLOCKED se è bloccato


    Il più semplice algoritmo di scheduling è chiamato "Round Robin" -> Questo algoritmo, trascorsi un tot di tempo, mette in stato di RUNNING il primo task READY che trova nella tabella dei processi e lo manda dunque in esecuzione.


    Funzioni di comunicazione interprocesso
    Le funzioni per la comunicazione interprocesso sono appunto funzioni che permettono la comunicazione tra i processi.


    Gestione della memoria
    Le funzioni che permettono di gestire la memoria fisica devono tener conto, dopo aver calcolato la memoria RAM disponibile, delle locazioni occupate e quelle libere.
    è possibile immaginare la memoria ram come un array di n elementi e pensare che ogni singolo bit di ogni singolo elemento sia una locazione di memoria. Se una locazione di memoria e occupata o riservata allora bisogna porre il bit corrispondente ad uno. Una volta resa libera basta porlo a 0.
    L' array viene chiamato BITMAP.


    Per gestire la memoria ram esistono numerosi altri approcci. La bitmap è quello piu semplice.


    I processori x86 permettono indirizzamenti a 32 bit(in protect mode) quindi teoricamente possono indirizzare 4GB di memoria. Ma la dimensione della Ram puo essere molto di meno.
    Sarebbe uno spreco avere la possibilita' di far riferimento a 4GB di memoria ma averne molto di meno. Quindi entra in gioco la memoria virtuale e in particolare la paginazione.
    Una volta attivata la paginazione tutti gli indirizzi vengono considerati come indirizzi virtuali.
    Un indirizzo virtuale è di questo tipo: PDOFF | PTOFF | OFF
    PDOFF, PTOFF E OFF sono degli offset di degli array(PageDir, PageTable) che indicizzeranno una pagina e piu in generale un indirizzo fisico.


    La memoria fisica, cioè quella reale, viene divisa in blocchi generalmente da 4KB ciascuno e ogni blocco fisico prende il nome di "pagina". Se la pagina non viene trovata viene generata una eccezione, che non è altro che un interrupt un po' particolare. l' eccezione che viene generata in questo caso si chiama PAGE FAULT ed è l' eccezione numero 14. Tramite questa eccezione è possibile gestire la memoria virtuale ed in generale utilizzando un sistema chiamato "Demand Paging" è possibile utilizzare praticamente i 4gb di indirizzamento.


    Per gestire la memoria ci sono altri svariati modi poiché non esiste il modo più efficiente per gestirla.
    La dimensione di una pagina può anche variare.

    Per oggi è tutto, un saluto da d23


    Ultima modifica di d23; 15-04-2014 alle 00:47
    Il possibile lo facciamo.
    L'impossibile lo realizziamo.
    Per i miracoli ci stiamo attrezzando.
    Impossibile? ERROR 404 FILE NOT FOUND.

  2. #2
    Utente Esperto L'avatar di d23
    Data Registrazione
    Dec 2013
    Messaggi
    337
    Non so quanto questo argomento interessi nel mondo del web e in Italia (visto che il post è in italiano), ma comunque a meno di 2 anni dalla mia tesina (si, sono stato bocciato 1 anno per una serie di eventi :P) ho deciso finalmente che porterò un sistema operativo scritto interamente da me (sto ancora vedendo se fare qualcosa di alternativo oppure unix-like, sicuramente avrà un kernel monolitico modulare). Di certo è un progetto ambizioso, non di facile realizzazione e so a cosa vado incontro, ma per quello che voglio fare mi basterà arrivare agli obiettivi prefissati che non sono nulla di impossibile. Le alternative erano senz'altro più semplici (un videogioco con grafica 3D, scritto in C# con motore anx o xna, ma alla fine roba che avevo già fatto e finito), ma la realizzazione un sistema completamente funzionante, in grado di farti fare le cose più basilari, ma che comunque rappresenta il lavoro e la realizzazione di un obiettivo è sicuramente più appagante.
    Detto questo non ho giustificazioni per la mia assenza, diciamo che le questioni personali mi hanno travolto davvero molto (e io sono un tipo molto emotivo), ma vorrei informarvi di questo mio progetto (se ancora qualcuno legge questa sezione del forum) e se c'è tra di voi un matto come me sono ben lieto di essere suo "maestro", tra virgolette perché al livello in cui sono ora non sono nemmeno in grado di finirlo un sistema operativo, anche se le basi per iniziarlo e per scrivere parte delle sue funzioni le ho. Per il resto online c'è molta documentazione utile, manuali intel sempre a portata di mano, tabella dei colori, degli interrupt, dare una sbirciatina veloce alle istruzioni asm che non ricordi bene o a come le librerie del C hanno implementato una funzione in modo che tu possa implementarla allo stesso modo nel tuo os, sorgenti di os from scratch o dei più famosi unix e derivati (linux per esempio) Insomma internet ci da sicuramente una mano, nel mio caso poi è un progetto che dovrò portare alla maturità quindi la determinazione è tanta, ma sono sicuro che anche tra voi ci sarà qualcuno determinato almeno quanto me.

    Detto questo è tutto, un saluto, d23.
    Il possibile lo facciamo.
    L'impossibile lo realizziamo.
    Per i miracoli ci stiamo attrezzando.
    Impossibile? ERROR 404 FILE NOT FOUND.

  3. #3
    Utente Esperto L'avatar di Eagle2
    Data Registrazione
    Aug 2013
    Messaggi
    228
    Che piacere rivederti fatti sentire ogni tanto che devo proporti una cosa in relazione con quanto scritto. Ci sei mancato <3

  4. #4
    Utente Esperto L'avatar di d23
    Data Registrazione
    Dec 2013
    Messaggi
    337
    Citazione Originariamente Scritto da Eagle2 Visualizza Messaggio
    Che piacere rivederti fatti sentire ogni tanto che devo proporti una cosa in relazione con quanto scritto. Ci sei mancato <3
    Sono stato per 2 settimane senza pc. Ieri l'ho finalmente riavuto e ho pensato di farmi risentire (avendo anche parlato con Cod il mese scorso). Se hai qualche proposta scrivimi pure su Whatsapp o qui sul forum in mp.
    Il possibile lo facciamo.
    L'impossibile lo realizziamo.
    Per i miracoli ci stiamo attrezzando.
    Impossibile? ERROR 404 FILE NOT FOUND.

Termini piu ricercati:

os dev ita

osdev interrupt tutorial