Requisiti per sviluppare un sistema operativo (Curiosità)

dev_java

Utente Attivo
169
91
CPU
AMD Ryzen 5 3600
Dissipatore
CoolerMaster Hyper 212 Black Edition
Scheda Madre
Aorus B450I PRO WIFI
HDD
Samsung 860 EVO 500 GB + WD Red NAS Edition
RAM
32GB Corsair Vengeance 3200mhz
GPU
Gigabyte 1650 SUPER Windforce
Monitor
Samsung C27F396
PSU
Seasonic Focus GX-550, 80+ GOLD
Case
NZXT H210
Periferiche
Drevo Tyrfing V2, Logitech G402 Hyperion Fury
OS
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
2,868
916
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

Utente Attivo
169
91
CPU
AMD Ryzen 5 3600
Dissipatore
CoolerMaster Hyper 212 Black Edition
Scheda Madre
Aorus B450I PRO WIFI
HDD
Samsung 860 EVO 500 GB + WD Red NAS Edition
RAM
32GB Corsair Vengeance 3200mhz
GPU
Gigabyte 1650 SUPER Windforce
Monitor
Samsung C27F396
PSU
Seasonic Focus GX-550, 80+ GOLD
Case
NZXT H210
Periferiche
Drevo Tyrfing V2, Logitech G402 Hyperion Fury
OS
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

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
Reazioni: dev_java

dev_java

Utente Attivo
169
91
CPU
AMD Ryzen 5 3600
Dissipatore
CoolerMaster Hyper 212 Black Edition
Scheda Madre
Aorus B450I PRO WIFI
HDD
Samsung 860 EVO 500 GB + WD Red NAS Edition
RAM
32GB Corsair Vengeance 3200mhz
GPU
Gigabyte 1650 SUPER Windforce
Monitor
Samsung C27F396
PSU
Seasonic Focus GX-550, 80+ GOLD
Case
NZXT H210
Periferiche
Drevo Tyrfing V2, Logitech G402 Hyperion Fury
OS
Windows 10 Pro, Ubuntu

pabloski

Utente Èlite
2,868
916
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

Utente Attivo
169
91
CPU
AMD Ryzen 5 3600
Dissipatore
CoolerMaster Hyper 212 Black Edition
Scheda Madre
Aorus B450I PRO WIFI
HDD
Samsung 860 EVO 500 GB + WD Red NAS Edition
RAM
32GB Corsair Vengeance 3200mhz
GPU
Gigabyte 1650 SUPER Windforce
Monitor
Samsung C27F396
PSU
Seasonic Focus GX-550, 80+ GOLD
Case
NZXT H210
Periferiche
Drevo Tyrfing V2, Logitech G402 Hyperion Fury
OS
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
Discord Ufficiale Entra ora!