Come vengono compilati e avviati i sistemi operativi per la prima volta?

6

Sono interessato a come funzionano i sistemi operativi. Ho letto alcuni articoli su Linux e sembra che capisca come generalmente tutto ciò si riunisce, ma sento che c'è un dilemma di uova e galline quando si tratta di costruire un sistema operativo.

Poiché Linux è scritto in C (e Assembly), che richiede la compilazione di un compilatore, come si può effettivamente compilare un sistema operativo per la prima volta? Scrivi prima un boot loader dal tuo SO esistente? O fai qualcos'altro? Devi eseguire il dual boot per la prima volta? O hai bisogno di due macchine? A cosa è finito Linus quando ha iniziato il suo progetto? Come è apparso il suo primissimo risultato?

Qual è la prima cosa che devi progettare e scrivere quando stai programmando un sistema operativo?

    
posta Leo 18.03.2013 - 03:45
fonte

1 risposta

3

Questo succede sempre nei sistemi embedded. Generalmente si compila su un sistema operativo esistente che punta a qualunque processore si stia facendo per il sistema operativo. Questo codice deve quindi essere messo in una forma che il processore può caricare, sia in una EPROM, sia che si faccia un "Bootloader" che ha il compito di essere la prima cosa che il processore eseguirà, quindi funzionerà come caricare il OS fuori da un mezzo come un hard disk.

Sull'architettura del PC c'è un "BIOS" che fornisce l'accesso di base a vari hardware come schermo e hard disk, ecc. Esegue il "Bootloading" per te. Quindi la maggior parte dei sistemi operativi basati su PC come linux e windows usano questo per andare avanti usando un "Boot Sector" su qualcosa che fornisce un file system.

Il sistema operativo più semplice è spesso solo un task scheduler (multi-threading) e un semplice livello di astrazione dell'hardware. Per la pianificazione delle attività in genere si dispone di una sorgente di timer che attiva un interrupt

void MyTaskSchedulerInterruptHandler()
{
   SaveStateOfCurrentTask(); // save all the CPU registers
   FindNextTaskToExecute();  // using tables of tasks currently being run, 
                             //find one to run next
   ExecuteTask();  // load all the CPU registers for this task
   // return from interrupt will then make the CPU start on the loaded task
}


main()
{    
    SetupInterruptVectors();
    InitializeHardware();
    StartSystemTasks();
   //never gets here
}
    
risposta data 18.03.2013 - 03:52
fonte

Leggi altre domande sui tag