Requisiti per sviluppare un sistema operativo (Curiosità)

dev_java

Nuovo Utente
75
34
Hardware Utente
CPU
Intel® Core™ i3-2348M
Hard Disk
Samsung 860 EVO 500 GB
RAM
8 GB Samsung DDR3
Scheda Video
AMD Radeon™ HD 7610M
Monitor
Samsung C27F396
Case
Toshiba Satellite C855-2CL Chassis
Sistema Operativo
Windows 10 Pro, Ubuntu
Ciao a tutti,
come da titolo vorrei sapere quali siano i requisiti e le conoscenze necessarie per sviluppare un sistema operativo...
So benissimo che è un impresa ardua che richiede moltissimo tempo e dedizione, per questo non sono per nulla intenzionato a svilupparne uno :suicidio:

La mia infatti è solo pura curiosità, giusto per farmi un idea di cosa si deve conoscere e magari imparare qualcosa che va oltre la semplice programmazione di applicazioni.

Ringrazio anticipatamente tutti coloro che vorranno aiutarmi
:thanks:
 

pabloski

Utente Èlite
1,979
407
Hardware Utente
Conoscenza assoluta dell'hardware su cui dovrà girare. Il sistema operativo programma l'hardware, ergo deve conoscerne ogni caratteristica e ogni quirk e bug.

Conoscenza delle metodologie usate per implementare: (1) memoria virtuale, (2) gestione dei file, (3) gestione degli accessi alle risorse fisiche e non, (4) gestione delle attività di networking. Cioè tutti quei meccanismi ed algoritmi che sono stati sviluppati nei decenni per gestire in memoria efficiente le varie astrazioni implementate dai sistemi operativi.

Conoscenza del linguaggio assemblativo del processore, senza il quale è impossibile implementare le routine di più basso livello ( tipo quelle che settano il gdt, la pmode/long mode, ecc... E conoscenza di un linguaggio che implementi l'aritmetica dei puntatori, non necessiti di un runtime per far girare i programmi ( altrimenti devi prima implementare il runtime per il tuo OS ) e non implementi nessun tipo di pcode, virtual machine, just in time compilation, managed memory e tutte le cose fighe che usiamo oggi.

Comunque non è tutto questo granchè, almeno a livello teorico. A livello pratico è chiaro che si perdono ore ed ore nel debug ( che non è semplice come quello delle applicazioni usermode ), si fa a cazzotti coi bug dell'hardware di alcuni produttori, si fa a cazzotti con la disponibilità di driver e programmi.

Cioè ci vuole tempo, ma non è uno sforzo d'intelligenza particolarmente elevato. E' più difficile realizzare un web browser moderno che un sistema operativo.
 

dev_java

Nuovo Utente
75
34
Hardware Utente
CPU
Intel® Core™ i3-2348M
Hard Disk
Samsung 860 EVO 500 GB
RAM
8 GB Samsung DDR3
Scheda Video
AMD Radeon™ HD 7610M
Monitor
Samsung C27F396
Case
Toshiba Satellite C855-2CL Chassis
Sistema Operativo
Windows 10 Pro, Ubuntu
Conoscenza assoluta dell'hardware su cui dovrà girare. Il sistema operativo programma l'hardware, ergo deve conoscerne ogni caratteristica e ogni quirk e bug.

Conoscenza delle metodologie usate per implementare: (1) memoria virtuale, (2) gestione dei file, (3) gestione degli accessi alle risorse fisiche e non, (4) gestione delle attività di networking. Cioè tutti quei meccanismi ed algoritmi che sono stati sviluppati nei decenni per gestire in memoria efficiente le varie astrazioni implementate dai sistemi operativi.

Conoscenza del linguaggio assemblativo del processore, senza il quale è impossibile implementare le routine di più basso livello ( tipo quelle che settano il gdt, la pmode/long mode, ecc... E conoscenza di un linguaggio che implementi l'aritmetica dei puntatori, non necessiti di un runtime per far girare i programmi ( altrimenti devi prima implementare il runtime per il tuo OS ) e non implementi nessun tipo di pcode, virtual machine, just in time compilation, managed memory e tutte le cose fighe che usiamo oggi.

Comunque non è tutto questo granchè, almeno a livello teorico. A livello pratico è chiaro che si perdono ore ed ore nel debug ( che non è semplice come quello delle applicazioni usermode ), si fa a cazzotti coi bug dell'hardware di alcuni produttori, si fa a cazzotti con la disponibilità di driver e programmi.

Cioè ci vuole tempo, ma non è uno sforzo d'intelligenza particolarmente elevato. E' più difficile realizzare un web browser moderno che un sistema operativo.
Grazie mille per la risposta esaustiva, sapresti per caso indicarmi una qualche guida o sito web per studiare queste cose?

Grazie ancora
 

DispatchCode

Utente Attivo
603
363
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Grazie mille per la risposta esaustiva, sapresti per caso indicarmi una qualche guida o sito web per studiare queste cose?

Grazie ancora
Una delle risorse più conosciute è questa: https://wiki.osdev.org/Main_Page

Ovviamente sarebbe gradita prima la lettura di altri testi, ad esempio di architettura e sistemi operativi (per farti una base minima).
 
  • Mi piace
Reactions: dev_java

dev_java

Nuovo Utente
75
34
Hardware Utente
CPU
Intel® Core™ i3-2348M
Hard Disk
Samsung 860 EVO 500 GB
RAM
8 GB Samsung DDR3
Scheda Video
AMD Radeon™ HD 7610M
Monitor
Samsung C27F396
Case
Toshiba Satellite C855-2CL Chassis
Sistema Operativo
Windows 10 Pro, Ubuntu

pabloski

Utente Èlite
1,979
407
Hardware Utente
Perfetto grazie mille

:thanks:
Aggiungerei che è fondamentale conoscere l'architettura dei calcolatori e poi quella del target ( x86, ARM o che altro ). Una conoscenza degli algoritmi e delle strutture dati tipici.

Infine tematiche dei sistemi operativi, tipo gestione della memoria, filesystem, ecc... quindi uno studio almeno basilare su un buon libro di sistemi operativi.

Poi c'è la possibilità di usare risorse più pratiche e studiare man mano. Tipo questa https://www.amazon.it/dp/0136379508/?tag=tomsforum-21 o questa https://github.com/AllenDowney/ThinkOS o ancora "Writing a Simple Operating System from Scratch"

Lo studio di un OS educativo tipo HelenOS o xv6. Quest'ultimo c'ha pure un libretto "xv6 a simple, Unix-like teaching operating system".

E ovviamente ci saranno delle cose che non capirai all'inizio, per cui sarebbe necessario approfondirle altrove. Per esempio io iniziai anni fa col libro "Programming the 8086/8088" di Coffron.

Ci sono delle cose dei computer che non sono affatto intuitive per i novizi. Per esempio il fatto che dati ed istruzioni siano praticamente la stessa cosa dal punto di vista del processore. Puoi benissimo fare un jump nel bel mezzo di un'array e il processore comincerà ad eseguire la roba che trova lì. Ovviamente al 99% si bloccherà perchè quei dati non contengono una sequenza di istruzioni che faccia qualcosa di sensato.

Oppure si parla tanto di file binari, ma non è che dentro c'è 0010111100.... quando lo apri vedi una sfilza di ghirigori in ASCII. Per chi programma solo ad alto livello, spesso è facile non considerare queste cose.

Tanto per dire, il libro di Coffron contiene le codifiche binarie delle istruzioni 8086. All'epoca ( non avendo un assemblatore, perchè costavano ) scrivevo programmi in assembly a mano, poi li trasformavo nelle giuste sequenze binarie, che poi traducevo in byte ( cioè il numeretto da 0 a 255 ) e le mettevo in un programma Basic sotto forma di Data e glieli facevo scrivere sul file binario ( .com, all'epoca non avevo informazioni sulla struttura degli .exe ).

E questa cosa mi aiutò a capire parecchio del concetto di codifica e del fatto che uno stesso oggetto può essere rappresentato in tanti modi diversi.

Però ripeto, sono quei dettagli talmente a basso livello, che il 99% dei programmatori non li considera e talvolta non li conosce.

Riguardo i libri ( e qualcuno sarà per forza necessario ) considera quelli accoppiati ad un OS realmente sviluppato. xv6, Mika, Xinu, Minix. Quest'ultimo è realizzato da Tanenbaum e i suoi studenti, è usato per davvero in molte applicazioni ( il management engine dei processori x86, ad esempio ) e l'autore ha un modo di spiegare le cose molto scorrevole e comprensibile.

Potresti semplificarti la vita con questo https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/

E' un corso molto ben fatto, sulla programmazione di un OS per Raspberry Pi 1. Il problema è che è fermo alla versione 1 del Raspberry e va modificato per essere usato con le ultime varianti. Il lato positivo è che è fatto apposta per insegnare i concetti fondamentali. Il vantaggio è che col RPi ci puoi giocare come ti pare, senza incasinare il pc ( ok oggi si usano le virtual machine per questo genere di cose ).
 

dev_java

Nuovo Utente
75
34
Hardware Utente
CPU
Intel® Core™ i3-2348M
Hard Disk
Samsung 860 EVO 500 GB
RAM
8 GB Samsung DDR3
Scheda Video
AMD Radeon™ HD 7610M
Monitor
Samsung C27F396
Case
Toshiba Satellite C855-2CL Chassis
Sistema Operativo
Windows 10 Pro, Ubuntu
Aggiungerei che è fondamentale conoscere l'architettura dei calcolatori e poi quella del target ( x86, ARM o che altro ). Una conoscenza degli algoritmi e delle strutture dati tipici.

Infine tematiche dei sistemi operativi, tipo gestione della memoria, filesystem, ecc... quindi uno studio almeno basilare su un buon libro di sistemi operativi.

Poi c'è la possibilità di usare risorse più pratiche e studiare man mano. Tipo questa https://www.amazon.it/dp/0136379508/?tag=tomsforum-21 o questa https://github.com/AllenDowney/ThinkOS o ancora "Writing a Simple Operating System from Scratch"

Lo studio di un OS educativo tipo HelenOS o xv6. Quest'ultimo c'ha pure un libretto "xv6 a simple, Unix-like teaching operating system".

E ovviamente ci saranno delle cose che non capirai all'inizio, per cui sarebbe necessario approfondirle altrove. Per esempio io iniziai anni fa col libro "Programming the 8086/8088" di Coffron.

Ci sono delle cose dei computer che non sono affatto intuitive per i novizi. Per esempio il fatto che dati ed istruzioni siano praticamente la stessa cosa dal punto di vista del processore. Puoi benissimo fare un jump nel bel mezzo di un'array e il processore comincerà ad eseguire la roba che trova lì. Ovviamente al 99% si bloccherà perchè quei dati non contengono una sequenza di istruzioni che faccia qualcosa di sensato.

Oppure si parla tanto di file binari, ma non è che dentro c'è 0010111100.... quando lo apri vedi una sfilza di ghirigori in ASCII. Per chi programma solo ad alto livello, spesso è facile non considerare queste cose.

Tanto per dire, il libro di Coffron contiene le codifiche binarie delle istruzioni 8086. All'epoca ( non avendo un assemblatore, perchè costavano ) scrivevo programmi in assembly a mano, poi li trasformavo nelle giuste sequenze binarie, che poi traducevo in byte ( cioè il numeretto da 0 a 255 ) e le mettevo in un programma Basic sotto forma di Data e glieli facevo scrivere sul file binario ( .com, all'epoca non avevo informazioni sulla struttura degli .exe ).

E questa cosa mi aiutò a capire parecchio del concetto di codifica e del fatto che uno stesso oggetto può essere rappresentato in tanti modi diversi.

Però ripeto, sono quei dettagli talmente a basso livello, che il 99% dei programmatori non li considera e talvolta non li conosce.

Riguardo i libri ( e qualcuno sarà per forza necessario ) considera quelli accoppiati ad un OS realmente sviluppato. xv6, Mika, Xinu, Minix. Quest'ultimo è realizzato da Tanenbaum e i suoi studenti, è usato per davvero in molte applicazioni ( il management engine dei processori x86, ad esempio ) e l'autore ha un modo di spiegare le cose molto scorrevole e comprensibile.

Potresti semplificarti la vita con questo https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/

E' un corso molto ben fatto, sulla programmazione di un OS per Raspberry Pi 1. Il problema è che è fermo alla versione 1 del Raspberry e va modificato per essere usato con le ultime varianti. Il lato positivo è che è fatto apposta per insegnare i concetti fondamentali. Il vantaggio è che col RPi ci puoi giocare come ti pare, senza incasinare il pc ( ok oggi si usano le virtual machine per questo genere di cose ).
Wow! Grazie veramente per questa risposta esaustiva e completa...
Avrò un bel po' di cose da imparare :suicidio:

:thanks:
 

Entra

oppure Accedi utilizzando