Corso di AmigaOS

Torna all'elenco delle lezioniPer dubbi, consigli o richieste, potete mandare un'e-mail ad Andrea Carolfi.
Ringraziamo Amiga Transactor Mailing List per questo tangibile contributo!


La struttura di AmigaOS: librerie, device e resource (Prima lezione)

L'AmigaOS e` composto da piu` sotto parti sovrapposte in vari strati. Vi sono le resource, i device e le library. Quelli piu` a basso livello sono le resource, poi vengono i device ed infine le library.
Un esempio di questi sono: ciaa.resource, audio.device, exec.library.

Le librerie
La struttura interna dell'AmigaOS puo` essere rappresentata così (a partire dall'hardware):

exec.library layers.library
dos.library graphics.library
icon.library intuition.library
workbench.library gadtools.library
MUI.library (anche se non fa parte dell'OS)

A sinistra abbiamo la gestione dei task e dei processi oltre che del filesystem, a destra abbiamo la gestione della grafica.

Compito della exec.library è gestire l'intero sistema creando/schedulando/rimuovendo task, gestendo porte messaggi, semafori, liste di blocchi di memoria libera e così via. Exec e' il cuore dell'AmigaOS ed in genere è il gestore di tutte le risorse di amiga (infatti è con una funzione della exec.library che si possono "aprire" le resource ed i device).
Sopra ad exec, c'è il DOS (dos.library) che fornisce anch'esso la possibilita` di interagire con i processi (livello superiore di un task) e con il filesystem, gestendo i file, i cassetti, i pacchetti DOS ecc. ecc.
Il livello superiore e` occupato (quasi a pari merito) dalla icon.library (gestione delle icone) e dalla workbench.library (appicon, appmenu).

Compito della layers.library è gestire la sovrapposizione delle finestre (layer = strato) più altre cose. Il più delle volte questa libreria viene usata dall'OS e poche volte viene manipolata direttamente dall'utente/programmatore.
Sopra (ma in pratica è a fianco) alla layers.library risiede la graphics.library. Questa libreria si incarica di svolgere quelle attività di grafica a basso livello come può essere il tracciamento di un cerchio, il riempimento di un'area, lo spostamento di un'area di pixel da una zona ad un'altra (blitting) e via dicendo. Viene usata da intuition per il tracciamento delle finestre, dei gadget e via dicendo.
Infatti, sopra alla graphics.library c'è la intuition.library. Suo è il compito di gestire prevalentemente schermi, finestre, menù e bottoni. Ultimamente la intuition è stata potenziata ed estesa con il sistema BOOPSI (Basic Object Oriented Programming System for Intuition) che ha permesso il proliferare di librerie quali MUI, ClassAct et similia.

Chiudono il livello ultimo quelle librerie rivolte a semplificare la vita al programmatore quali: gadtools.library (creazione/gestione di bottoni e menu`), MUI.library bgui.library e compagnia bella.

I device
Ora che abbiamo descritto molto sommariamente le varie librerie portanti dell'AmigaOS, passiamo ad esaminare brevemente, alcuni dei più importanti device. Quest'ultimi non sono organizzati a livelli, in quanto ognuno di essi, ha il compito di controllare/gestire l'hardware per il quale è stato progettato: audio.device, trackdisk.device, timer.device, serial.device, parallel.device, narrator.device, input.device.
Fatta eccezione per quelli il cui compito lo si intuisce dal nome, il timer.device viene principalmente usato per la gestione delle temporizzazioni, permettendo la richiesta di invio di un segnale allo scadere di un determinato lasso di tempo; il trackdisk.device per gestire i floppy disk, il narrator.device per la gestione dei fonemi e la riproduzione di linguaggio umano; l'input.device per la gestione di tastiera e mouse (per il joystick esiste un device specifico: game.device).

In generale, questi device sono l'ultima risorsa per accedere all'hardware visto che di solito, funzioni similari sono offerte da librerie poste ad un livello piu` elevato. Per fare un esempio: se un nostro programma ha bisogno di essere sospeso per due secondi, il piu` delle volte è sufficente fare una chiamata alla dos.library con la funzione Delay(100) (2 secondi espressi in 50mi di secondo). Se invece abbiamo bisogno di tempi piu` accurati (la dos.library e` sufficentemente imprecisa), allora sara` il caso di rivolgersi al timer.device o addirittura alla ciaa.resource o ciab.resource.
Anche per fare una stampa, anziche` usare il parallel.device (o il printer.device) il piu` delle volte puo` bastare un semplice 'Copy xxx to PRT:' fatta con una Run() o una Exec() della dos.library. È ovvio, che non tutte le volte si può fare una determinata cosa con le procedure fornite; perché sono troppo lente, o troppo complesse per l'uso che se ne vuole fare o per altre ragioni. Ecco perche` esistono i device e le resource che permetto un'accesso a basso livello ma legale, dell'hardware (per ora comunque, dato il loro uso piuttosto raro, lasciamo da parte le resource).

Un esempio
Adesso che abbiamo descritto in maniera sommaria le library ed i device, passiamo al primo programmino semplice semplice per spiegare praticamente ciò che ho descritto poco prima.

#include <dos/dos.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <stdio.h>
#include <error.h>

struct DOSBase *DOSBase;

void main(void)
{
   if(DOSBase = (struct DOSBase *)OpenLibrary("dos.library",0))
   {
      printf("Aspetto per due secondi e poi termino...");
      Delay(100);
      printf("fatto.\n");
      CloseLibrary((struct Library *)DOSBase);
   }
   else
      perror("Impossibile aprire la libreria DOS!\n");
}

Questo programmino semplicissimo ed idiota :-) , apre la dos.library, e, usando una sua funzione, aspetta due secondi prima di terminare.
Esaminiamo con la lente il sorgente (anche la rima :-) ): le prime quattro righe sono degli include per non generare errori e/o warning mentre si compila. Il primo file, contiene la dichiarazione del tipo di dato struct DOSBase, il secondo contiene i prototipi delle funzioni OpenLibrary e CloseLibrary, il terzo il prototipo della Delay(), il quarto della printf() e infine il quinto ha la dichiarazione della perror.
Adesso analizziamo le funzioni coinvolte. Come molti di voi sapranno, nel C non esistono le procedure, queste in realtà sono delle funzioni che non ritornano nulla 8-0. Anche l'AmigaOS, rispetta quasi sempre queste direttive e le sue librerie hanno moltissime funzioni e poche procedure, anche perché il più delle volte si richede qualcosa che deve essere per forza ritornato.
L'apertura delle librerie
In generale, le librerie principali, sono già aperte all'avvio del sistema (exec stessa non necessita di essere aperta: come chiamare la OpenLibrary, di exec, per aprire la libreria stessa?), l'apertura serve per permettere l'accesso al puntatore alla BASE della libreria per poi poter effettuare con questo puntatore i salti alle varie funzioni.
La struttura infatti contiene i vari spiazzamenti che devono essere compiuti per ottenere l'indirizzo di una determinata funzione.
Le uniche librerie che potrebbero non essere aperte, sono quelle su disco, che quindi necessitano di essere caricate in memoria.
Con la prima chiamata di funzione, richiediamo l'apertura delle libreria dos.library versione 0. Openlibrary () cerca nella lista di exec delle librerie attualmente aperte, la libreria interessata, se non la trova apre la versione su disco, altrimenti la versione presente su ROM. Il numero 0 di versione, richesto e` il numero minimo. Siccome dall'1.0 all'3.1 le librerie sono state modificate ed amplicate, diverse funzioni sono state aggiunte. Quindi è necessario, prima di compiere una chiamata ad una determinata funzione, assicurarsi che questa esista nella versione di libreria correntemente utilizzata.
Specificare 0, come numero di versione, significa che il nostro programma non necessita di particolari funzioni e che quindi va benissimo anche la libreria del 1.0. Se invece, avessimo bisogno, per esempio, di una funzione presente solo dal 2.0 in su, allora avremmo dovuto specificare 37.
In definitiva, OpenLibrary () ritorna il puntatore alla base della libreria, se ha avuto successo; NULL in caso contrario.
Una volta aperta con successo la libreria, e` possibile chiamare tutte le funzioni in essa contenute, ecco quindi la chiamata alla procedura Delay che richiede come parametro, il numero di 50mi di secondo per il quale sospendere il processo chiamante.

Fatto questo, ecco la chiamata alla procedura di exec CloseLibrary, che rilascia il puntatore della libreria. In realtà, la chiamata di questa procedura, non corrisponde quasi mai alla effettiva chiusura della libreria. Molto spesso, questa viene lasciata in memoria per ottimizzare eventuali richieste successive. Nel caso in cui venga effettuata una richesta di memoria, che il sistema non riesce a soddisfare, prima di ritornare negativamente, scandisce la memoria alla ricerca di librerie, device e resource, chiuse ed inutilizzate: se ne trova, queste vengono scaricate dalla memoria che torna ad essere libera. Questa operazione, puo` essere forzata con il comando 'avail flush' di AmigaDOS.

Bene, per questa prima puntata direi che può bastare. Per compito :-) vi lascio da provare il programmino descritto.

Versione librerieVersione wb
331.2
341.3
35, 36beta interne, non utilizzate
372.0
372.0
382.1 (mai visto in Italia)
393.0
403.1
I numeri di versione

Indice delle lezioni Prossima lezione
Copyright AMiWoRLD Ph0ton