• Non ci sono risultati.

3.2 Macrostruttura di SimCPU - nuova versione

3.2.1 Nuove metodologie di input e di output

L'aspetto hardware di SimCPU più profondamente revisionato riguarda la simu-lazione dei dispositivi di input e di output, che è stato accompagnato da una revisione completa del principio stesso in base al quale vengono realizzate tali operazioni. Inoltre, per dispositivi di I/O, non si intende solamente il monitor e la tastiera. Come già introdotto nel capitolo concernete i sistemi operativi, la necessità di operare in un regime di multitasking di tipo time sharing, ha previsto la simulazione di un ulteriore dispositivo hardware esterno, il timer (orologio).

Le prospettive sulle quali sembra costituirsi la nuova struttura di SimCPU, riguardano la simulazione di tre dispositivi di input e di output: il timer, il monitor e la tastiera. Il principio secondo il quale verranno realizzate le funzioni di simulazione è quello secondo il quale i dispositivi esterni devono essere semplici e poco intelligenti e ciò si traduce essenzialmente nel fatto che ogni dispositivo

3.2. MACROSTRUTTURA DI SIMCPU - NUOVA VERSIONE 27

deve risultare un dispositivo orientato a carattere ovvero a byte. La simulazione di una comunicazione di due o più byte sconna infatti già in un regime di pseudo-intelligenza del codice simulato che va oltre le nalità di questo progetto. In realtà una specie di comunicazione DMA (e questo è il genere di comunicazione orientata al trasferimento di un numero di byte maggiore di uno), era stata realizzata in una delle prime versioni di SimCPU. Tuttavia, le richieste di mantenere poco intelligente il dispositivo, hanno condotto ad un ridimensionamento notevole del codice. L'implementazione della comunicazione DMA è comunque prevista in successive versioni di SimCPU e il codice in parte è già stato scritto: seppur non spiegato in questa sede, rimarrà comunque a disposizione per utilizzi futuri.

Sono stati quindi individuati tre dispositivi di cui eseguire la simulazione. La simulazione di questi dispositivi, deve necessariamente avvenire in maniera parallela rispetto all'esecuzione del programma base. Le tecniche utilizzate per la simulazione dei dispositivi hardware riguardano la creazione di thread paralleli. Un thread, a grandi linee, rappresenta un'istanza di programma in esecuzione parallela rispetto al programma principale che lo ha creato. Quella dei thread, sembra dunque la tecnica più eciente ed ecace che è possibile adottare qualora si voglia simulare dispositivi esterni che necessitano di esecuzioni indipendenti e contemporanee.

Individuati i dispositivi da simulare e le tecniche di simulazione, è necessa-rio ora implementare un ecace metodo di comunicazione tra l'architettura e i dispositivi stessi. La scelta eettuata in questo senso, riguarda l'interposizione di un area di memoria condivisa tra l'architettura e i dispositivi di simulazione. Questa area di memoria, in codice C è stata implementata mediante un array di byte denominato devices_buer[]. L'introduzione di questa area di memo-ria, ha modicato drasticamente il sistema di input-output portando appunto all'eliminazione dei ag di completamento e delle istruzioni relative. Per capire eettivamente il perché, è necessario introdurre un ulteriore concetto, quello di canale di comunicazione; il nuovo sistema di interfacciamento è schematizzato nella gura [Fig. 3.1].

Figura 3.1: Modello della comunicazione nella nuova versione di SimCPU

Ogni dispositivo esterno sucientemente intelligente, possiede in genere due canali di comunicazione: il canale di controllo e il canale dati. Nelle precedenti versioni di SimCPU, le operazioni di input e di output venivano eettuate verso opportuni indirizzi di canale che in sostanza rappresentavano la maniera con la

quale l'architettura richiedeva al mondo esterno la stampa o la lettura di un dato. L'introduzione del buer (area di memoria condivisa tra i dispositivi e la CPU), ha permesso di mappare i canali di comunicazione dei dispositivi in quest'area di memoria. Dal punto di vista del codice stilato, i canali di comunicazione dei dispositivi rappresentano il puntatore al devices_buer[] che a quell'indirizzo conterrà il dato che la CPU o il dispositivo vorranno trasmettere.

Il principio secondo il quale il codice va inizialmente mantenuto semplice, ha implicato che alcuni dispositivi non fossero cosi sucientemente intelligenti da potersi permettere di utilizzare entrambi i canali di comunicazione. Così, ad esempio, il timer presenta solamente il canale di controllo, il monitor solamente il canale dati, mentre la tastiera li presenta entrambi. L'interposizione di un'area di memoria condivisa tra l'architettura e il Mondo Esterno sulla quale CPU e dispositivi comunicano, ha portato dunque alla ridondanza nei confronti dei ag di completamento. Con l'introduzione del buer, non è più necessario attendere che la richiesta venga completata perché le operazioni di lettura e di scrittura del buer da e verso la CPU si considerano automaticamente completate in un ciclo di bus.

Ricapitolando, dunque, si è lentamente formata questa panoramica sulla nuo-va congurazione dell'input e dell'output. I tre dispositivi hardware introdotti, simulati mediante thread, comunicano con la CPU attraverso un'area di memoria condivisa. Ogni locazione di quest'area di memoria è associata ad un canale di un dispositivo e dunque il dato contenuto nel canale è referenziabile mediante un opportuno indirizzo di canale. Ogni scrittura eseguita dal software mediante le istruzioni di input e di output su un determinato canale, viene eseguita nella rispettiva locazione dell'area di memoria condivisa e si considera già come com-pletata. Al pari di ciò, ogni lettura viene eseguita sullo stesso buer e si considera anch'essa come automaticamente eseguita in un ciclo di bus.

Dal punto di vista pratico, la lettura non è stata permessa sull'indirizzo dati del monitor in quanto in tale indirizzo non è necessario leggere. Allo stesso modo, la scrittura è stata disabilitata sull'indirizzo dati della tastiera, in quanto inviare dati alla tastiera non ha alcun senso. Viceversa, è stata abilitata sia la lettura che la scrittura nei confronti di tutti gli indirizzi di controllo (tastiera e timer).

Qui sotto si presenta la denizione dei parametri dei dispositivi di input e output, nonché la dichiarazione del buer dei dispositivi.

/∗ I /O ∗/ #define NIO_DEVICES 3 #define NIO_CHANNELS 4 #define CLOCK_ADDR_CNT 0 x0000 #define MONITOR_ADDR_DAT 0 x0002 #define KEYBOARD_ADDR_CNT 0 x0003 #define KEYBOARD_ADDR_DAT 0 x0004 /∗ I \O d e v i c e s b u f f e r d e c l a r a t i o n ∗/ byte d e v i c e s _ b u f f e r [NIO_CHANNELS ] ;

3.2. MACROSTRUTTURA DI SIMCPU - NUOVA VERSIONE 29

Figura 3.2: Mappa del devices_buer[] e posizione dei canali dei vari dispositivi

Documenti correlati