Newsgroup: it.comp.os.amiga
Titolo: [OT?] Scrivere (e... compilare) sistemi operativi

Prendo spunto dai post su AROS per porre una domanda (per alcuni forse
banale, ma non per me) alla quale non riesco a rispondere:
In poche parole... come si scrive e compila un sistema operativo?
Per esteso: un sistema operativo deve occuparsi della gestione della
memoria, dei dischi, dei processi, di tutte le risorse. Il punto e': con
quale compilatore lo... compilo? Prendiamo ad esempio AROS (tanto per non
andare troppo OT): oltre le versioni hosted, che si appoggiano su un sistema
operativo sottostante (non so quindi fino a che punto le versioni hosted
siano applicazioni o sistemi operativi) c'e' anche la  versione "nativa": su
che librerie si basa questa? I sorgenti, una volta compilati, vanno anche
linkati... ma con cosa? Le librerie con le quali si effettua il link
contengono chiamate a sistema... al sistema sottostante. Come fanno quindi
gli eseguibili linkati a tali librerie, se sotto si suppone non ci sia alcun
sistema operativo? Evidentemente il linking va eseguito diversamente...
Scusate la domanda forse banale, ma ringrazio in anticipo chi mi
rispondera'.
--
Retrocensitevi! Su:
http://valis.di.uniba.it/projects/retrocensimento
http://www.retrocensimento.cjb.net

 linkati... ma con cosa? Le librerie con le quali si effettua il lin
Se hai presente il kernel linux avrai visto che il kernel non viene 
linkato con alcuna libreria, rimane un oggetto ELF stand alone con una 
funzione di entry point.
Tale funzione tipicamente scritta in ASM dipende dall'architettura 
hardware. Alcuni processori al reset posizionano il program counter 
all'indirizzo 0 supponendo ci sia del codice, altri lo posizionano ad un 
indirizzo specificabile tramite un registro.
Io ogni caso l'applicazione che va in esecuzione a quel punto ha il 
controllo totale del sistema, ma lo vede a livello hardware, non hai 
printf(), read() o qualunque altra chiamata di libreria, solo quelle che 
hai definito tu all'interno del tuo kernel.
Scheduler, gestione della memoria, interrupt, sono tutti particolari 
tipici dell'architettura hardware e possono essere trovati nel manuale 
del processore. Il resto dipende dall'hardware che hai installato. Per 
l'IDE o le schede VGA esistono degli standard de facto che permettono di 
sfruttare le periferiche in modo minimale, per usare una scheda video o 
un controller UDMA a pieno pero' spesso serve un driver specifico, ed e' 
questo il motivo fondamentale per scrivere un sistema operativo per 
hardware "generico" e' un'operazione cosi' onerosa.
Bye,
  Gabry

 scritte in assembly.
[MegaCut]
Che Bello!Il mio linguaggio preferito :-)
Io per ora sto passando la fase "non so fare nulla, soprattutto le
implementazioni più sceme", e mi fa piacere che venga aperto un tread
così...
..si potrebbe parlare di come sia stato scritto AmigaOS e in che modo
funge, e 
confrontarlo con gli altri OS...credo che il livello di conoscenza sia
tale da poter intraprendere tale discorsone....anche per alimentare un pò
le discussioni ;-) 
Imparando qualcosa in più si cercano di evitare le fasi della vita come
quella suindicata.....
Sfruttamento di amighisti per conoscenza personale? SI :-)
ShInKurO
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 hai definito tu all'interno del tuo kernel.
Motivo per cui all'interno di driver del kernel linux bisogna usare "printk"
per stampare.
A questo punto mi chiedo quali compilatori permettano qualcosa del genere,
cioe' di generare codice eseguibile direttamente da un entry point.
Di solito generano file oggetto con riferimenti relativi (almeno quelli che
fin'ora ho utilizzato io) ed un po' di informazione di "header".


 fin'ora ho utilizzato io) ed un po' di informazione di "header".
Confondi il compilatore con il linker.
Ci sono sistemi operativi come VxWorks in cui il secondo non esiste 
neppure (carichi i .o in memoria e chiami le funzioni C direttamente dal 
prompt). Un oggetto o un eseguibile elf puo' essere rilocato a 
piacimento, anche a partire da 0x0000000 per esempio (anzi in molti unix 
tutte le applicazioni iniziano da una locazione virtuale 0x0000000). 
Inoltre puoi ottenere, perche' all'interno del formato e' presente, un 
puntatore ad ogni simbolo globale definito nell'oggetto.
Compilatore puoi usare quello che vuoi, il problema sta solo nell'avere 
un bootloader (applicazione che opera a livello hardware SENZA sistema 
operativo) capace di lanciare il tuo oggetto.
Il bootloader piu' utilizzato e' grub che permette di lanciare qualunque 
kernel in formato ELF, non solo linux, da partizioni ext2/3 o FATx. 
Penso sia stato lievemente modificato in modo da funzionare anche con 
dischi RDB in quanto e' usato anche per Aros e Amithlon.
Bye,
  Gabry

 o FATx.
grub, cioe' il sostituto di LILO? Bene, allora penso di aver chiarito il
"mistero": lilo e grub simulano in pratica un segmentino di sistema
operativo, che si occupa di caricare ed eseguire un file oggetto.
Ma a questo punto mi chiedo... come si compilano grub e lilo? Sono scritti
direttamente in assembly? Diversamente, mi troverei davanti al problema del
cane che si morde la coda...
