Architettura dei sistemi di elaborazione, PC e linguaggi a basso livello Fulvio Ferroni
[email protected]
2008.09.06
Questo documento si occupa dell’architettura di un sistema di elaborazione secondo il modello di Von Neumann illustrando a questo scopo un sistema didattico denominato AMC, dei principi di funzionamento e degli elementi di base dei moderni Personal Computer, delle caratteristiche del linguaggio macchina e di un generico linguaggio assembly. Il contenuto, riguardo l’AMC e i linguaggi di basso livello, è ispirato dai testi "L’Informatica" di P. Bishop ed. Jackson e "Elaboratori e loro applicazioni" vol. I di Cesarini, Soda, Pippolini ed. Cremonese, mentre, riguardo al Personal Computer, prevalentemente dal testo "Hardware del PC" do O. Maeran ed. McGraw-Hill.
Copyright Fulvio Ferroni
[email protected] Via Longarone, 6 - 31030 - Casier (TV) Le informazioni contenute in questa opera possono essere diffuse e riutilizzate in base alle condizioni poste dalla licenza GNU General Public License, come pubblicato dalla Free Software Foundation. In caso di modifica dell’opera e/o di riutilizzo parziale della stessa, secondo i termini della licenza, le annotazioni riferite a queste modifiche e i riferimenti all’origine di questa opera, devono risultare evidenti e apportate secondo modalità appropriate alle caratteristiche dell’opera stessa. In nessun caso è consentita la modifica di quanto, in modo evidente, esprime il pensiero, l’opinione o i sentimenti del suo autore. L’opera è priva di garanzie di qualunque tipo, come spiegato nella stessa licenza GNU General Public License. Queste condizioni e questo copyright si applicano all’opera nel suo complesso, salvo ove indicato espressamente in modo diverso. II
Indice generale 1 Architettura di un sistema di elaborazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.1
La macchina di Von Neumann . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2
Funzioni svolte dall’elaboratore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3
Componenti del sistema di elaborazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3.1 CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.3.2 Bus e clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.3.3 ALU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3.4 CU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 1.3.5 Memoria centrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.5.1 Struttura logica delle memorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.5.2 Memoria centrale del sistema di elaborazione . . . . . . . . . . . . . . . . . . . . . . 9 1.3.5.3 Ordinamento big endian e little endian dei dati in memoria . . . . . . . . . 10 1.3.5.4 Ciclo di memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.3.5.5 Struttura fisica della memoria centrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.3.5.6 Memoria cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.3.5.7 Memorie ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2 Architettura del sistema AMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.1
Struttura dell’AMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2
Memoria dell’AMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3
ALU dell’AMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4
Unità di Input/Output dell’AMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.5
Unità di controllo dell’AMC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3 Il Personal Computer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1
La scheda madre del PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1.1 3.1.2 3.1.3 3.1.4
3.2
Il processore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9
3.3
Fattore di forma della scheda madre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Il chipset della scheda madre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Bus di sistema e bus di I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Componenti integrati e altri elementi nella scheda madre . . . . . . . . . . . . . . . . 23 Ampiezza in bit dei registri della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Frequenza del clock della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Tecnologia costruttiva dei processori (legge di Moore) . . . . . . . . . . . . . . . . . . 25 Numero di pin della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Gestione della memoria da parte della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Architetture dei processori (pipeline e predizione) . . . . . . . . . . . . . . . . . . . . . . 28 Tipo di istruzioni delle CPU: CISC e RISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Generazioni di processori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Le CPU multicore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
La memoria centrale dei PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 III
3.4
Le periferiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.4.1 Comunicazione tra processore e periferiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.4.1.1 I/O programmato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.4.1.2 Le interruzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.4.1.3 Accesso diretto alla memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.4.1.4 Periferiche Plug and Play . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.4.2 Interfacce e controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.4.2.1 Interfaccia ATA parallela . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.4.2.2 Interfaccia ATA seriale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.4.2.3 Interfaccia SCSI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.4.2.4 Interfacce USB e FireWire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.4.3 Memorie ausiliarie o di massa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.4.3.1 Nastro magnetico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.4.3.2 Disco fisso e dischetto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.4.3.3 Dischi RAID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.4.3.4 Unità ottiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54 3.4.3.5 Memorie flash e unità SSD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3.4.3.6 Gerarchia delle memorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.4.4 Periferiche di I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.4.4.1 Tastiera e mouse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 3.4.4.2 Scanner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.4.4.3 Scheda video e monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.4.4.4 Stampante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 3.4.5 Interfacce di rete, modem e bluetooth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.5
Il BIOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4 Il linguaggio macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 4.1
Il ciclo istruzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.2
Descrizione e classificazione delle istruzioni macchina . . . . . . . . . . . . . . . . . . . . . . . 75 4.2.1 Classificazione delle istruzioni per funzione svolta . . . . . . . . . . . . . . . . . . . . . . 75 4.2.2 Classificazione delle istruzioni per numero di indirizzi . . . . . . . . . . . . . . . . . . 75
5 Il linguaggio assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 5.1
Problemi nell’uso del linguaggio macchina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.2
Gli assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.3
Esempio di programma in linguaggio macchina e in assembly . . . . . . . . . . . . . . . . . 79
5.4
Modi di indirizzamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
5.5
Traduzione dei programmi assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.5.1 Il programma assemblatore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 5.5.2 La fase di linking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 5.5.3 Il caricamento del programma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
IV
1
Capitolo
Architettura di un sistema di elaborazione
1
Il termine architettura riferito ai sistemi di elaborazione indica l’organizzazione logica dei vari componenti interni della macchina ed il modo in cui essi cooperano per eseguire le operazioni richieste dagli utenti. Quindi l’architettura di un elaboratore può essere dedotta dalla conoscenza della sua struttura interna e dal modo in cui è possibile far cooperare i suoi componenti fisici mediante una serie di comandi o ‘istruzioni’ (‘linguaggio macchina’).
1.1 La macchina di Von Neumann I moderni elaboratori elettronici, dai piccoli personal computer ai grandi maxi-computer, derivano in buona parte da uno stesso «modello» fondamentale di elaboratore chiamato ‘Macchina di Von Neumann’ dal nome dello scienziato che nel 1946 pubblicò, insieme ad altri, un progetto per una nuova macchina di calcolo automatico. Questa macchina è schematizzata in figura 1.1. F | igura 1.1.
Le linee continue rappresentano il flusso di dati, le linee tratteggiate il flusso di controllo, dal quale si capisce che tutte le unità agiscono in base ai segnali inviati da un componente denominato appunto ‘unità di controllo’. Le tre funzioni principali svolte dal sistema di elaborazione sono: • funzione di memoria; • funzione di esecuzione (calcoli e confronti); • funzione di controllo e governo. L’elaboratore è un sistema «automatico» in quanto tali funzioni vengono realizzate senza l’intervento diretto dell’uomo. La cooperazione tra le unità di controllo, esecuzione e memoria permette di eseguire algoritmi opportunamente descritti secondo determinati linguaggi ed inseriti in memoria. L’elaboratore è un sistema «versatile» in quanto può svolgere compiti molto diversi tra loro variando opportunamente gli algoritmi ad esso forniti.
2
Architettura di un sistema di elaborazione
Uno dei concetti fondamentali introdotti da Von Neumann e che costituì un passo avanti decisivo rispetto ai primi elaboratori dell’epoca, è quello di «programma memorizzato», cioè il fatto che il programma da eseguire (cioè la traduzione dell’algoritmo in una forma comprensibile alla macchina) viene immagazzinato in memoria al pari dei dati su cui esso opera. L’elaborazione consiste nella esecuzione delle istruzioni del programma, da parte della unità di esecuzione sotto il governo della unità di controllo, una alla volta secondo l’ordine in cui sono contenute nella memoria, fino al completamento dell’intero processo previsto dall’algoritmo. L’uomo interviene solo per dare il comando di avvio dell’esecuzione e per introdurre eventuali dati di input. Come detto il programma da eseguire deve essere scritto in precedenza in un apposito linguaggio (‘linguaggio di programmazione’), poi tradotto in una forma direttamente eseguibile dalla macchina (‘linguaggio macchina’) e quindi portato nella memoria dell’elaboratore. Le tre operazioni possono essere così riassunte: • fase di programmazione, eseguita dal programmatore; • fase di traduzione, eseguita da appositi programmi detti «compilatori» (qui non viene considerato il caso di programmi scritti con linguaggi «interpretati» invece che «compilati»); • fase di caricamento, eseguita da un programma detto ‘loader’. In queste dispense non vengono fornite ulteriori informazioni sui linguaggi di programmazione, eccetto per quelli a basso livello, come il linguaggio macchina o l’«assembly», trattati nel capitolo 4.
1.2 Funzioni svolte dall’elaboratore Vediamo più in dettaglio in cosa consistono le operazioni svolte da un elaboratore elettronico: • funzione di memoria: codifica di informazione (programmi e dati) su supporti in grado di conservarla per il tempo necessario alla elaborazione; • funzione di esecuzione: esecuzione di una specifica gamma di operazioni, potendo determinare l’operazione da eseguire tra quelle a disposizione e specificando gli «operandi» (dati) su cui essa opera; siccome le operazioni da svolgere sono principalmente di tipo aritmeticologico, l’unità di esecuzione viene anche chiamata ‘Unità aritmetico logica’ o ALU (Arithmetic and Logic Unit); • funzione di controllo: riconoscimento delle istruzioni da eseguire e conseguente avvio della loro esecuzione mediante opportuni segnali alla ALU; controllo della successione di istruzioni che compongono il programma; • funzione di ingresso o input: introduzione di dati e programmi nel sistema; • funzione di uscita o output: comunicazione di risultati all’esterno.
Architettura di un sistema di elaborazione
3
1.3 Componenti del sistema di elaborazione Lo schema di Von Neumann introdotto in precedenza, anche se concettualmente ancora valido, deve essere «aggiornato» con quello della figura 1.2. F | igura 1.2.
(sono indicate solo le linee di flusso dei dati e di controllo che entrano o escono dalla «Unità centrale»). Nella figura si possono individuare: • ‘Unità centrale’, adibita all’elaborazione dei dati ed al controllo generale del sistema; • ‘Unità di canale’, sono delle unità di controllo ausiliarie (talvolta addirittura degli elaboratori «satellite») adibite al collegamento con le ‘periferiche’ cioè i dispositivi che permettono il colloquio del sistema con l’ambiente esterno o la memorizzazione permanente di dati e programmi (tastiera, video, stampante, memorie di massa, ecc.).
1.3.1 CPU La CPU (Central Processing Unit) costituisce il cuore dell’elaboratore e il luogo dove avviene l’esecuzione delle istruzioni di un certo programma; è costituita dalla unione della ALU e della unità di controllo CU (Control Unit) nello stesso circuito integrato. Fisicamente si tratta di una piastrina di silicio contenente circuiti stampati costituiti da molte migliaia o milioni di semiconduttori che prende anche il nome di microprocessore. La CPU è dotata di un certo numero di celle di memoria «locale» (da non confondere con la memoria centrale) che servono a contenere i dati interessati alle operazioni da svolgere, queste celle di memoria si chiamano ‘registri’.
4
Architettura di un sistema di elaborazione
1.3.2 Bus e clock La CPU deve essere collegata alle altre componenti del sistema di elaborazione alle quali invia segnali di controllo ed in particolare alla memoria centrale con la quale deve avvenire un continuo scambio di segnali binari corrispondenti ad indirizzi di memoria o al contenuto (dati o istruzioni) delle celle di memoria o dei registri. Questo comporta la necessità di collegamenti fisici che vengono chiamati ‘bus’. Esistono tre tipi di bus: • bus dati; • bus indirizzi; • bus di controllo. Gli stessi collegamenti devono essere presenti anche all’interno della CPU per assicurare lo scambio di segnali tra le sue componenti interne; in questo caso si parla di bus (dati, indirizzi e di controllo) «interni». Il motivo per cui si parla di «indirizzi» risiede nella struttura logica e fisica della memoria centrale dell’elaboratore (illustrata più in dettaglio in seguito): essa è costituita da una sequenza di celle o locazioni numerate progressivamente e quindi individuabili tramite il proprio numero d’ordine o ‘indirizzo’. I bus possono essere indipendenti o condivisi; nel secondo caso vengono usate le stesse linee fisiche per trasportare segnali di natura diversa allo scopo di ottenere un risparmio di spazio e di costo, al prezzo di un certo deterioramento delle prestazioni,. Solitamente ad essere condivisi sono il bus dati e il bus indirizzi e viene usato un opportuno segnale di controllo per «chiarire» la natura degli impulsi trasportati in un certo momento nella linea di comunicazione. Affinché la CPU possa funzionare correttamente c’è anche l’esigenza di un dispositivo chiamato ‘clock’ che è un generatore di impulsi di durata costante emessi uno dopo l’altro ad intervalli di tempo regolari; lo scopo di questi impulsi è di sincronizzare tutti i circuiti ed il loro funzionamento all’interno della CPU, in modo che essi funzionino tutti all’unisono. In altre parole si può dire che gli impulsi generati dal clock innescano le azioni all’interno della CPU; a fronte di una entrata (di segnali) in un certo circuito, si ha la corrispondente uscita solo quando arriva anche un impulso dal clock; maggiore è la sua frequenza, maggiore è la velocità di funzionamento della CPU e quindi la quantità di lavoro da essa svolta in un certo tempo. La velocità del microprocessore (o meglio, del clock) si misura in cicli al secondo (frequenza degli impulsi) cioè in Hertz (Hz); le moderne CPU hanno frequenze di funzionamente dell’ordine dei miliardi di hertz o gigahertz (Ghz). Nella figura 1.3 viene presentato un possibile schema di unità centrale di elaborazione comprendente i vari bus e il clock.
Architettura di un sistema di elaborazione
5
F | igura 1.3.
1.3.3 ALU La ALU è una ‘rete logica’ in grado di eseguire operazioni logiche e aritmetiche sui dati; l’insieme delle operazioni che la ALU può eseguire costituisce il livello di dettaglio in cui devono essere espresse le istruzioni di un qualunque algoritmo da far eseguire all’elaboratore. Naturalmente tale livello di dettaglio non deve essere raggiunto direttamente dal programmatore che, come già accennato, scrive i suoi algoritmi in un linguaggio di programmazione e poi provvede alla loro traduzione in forma comprensibile alla macchina mediante la compilazione. Le operazioni vengono svolte dai circuiti della ALU con l’ausilio di appositi registri e precisamente: • uno o più registri ‘accumulatori’ (AC) per immagazzinare gli operandi delle operazioni da eseguire; • un ‘registro di stato’ (RS) nel quale vengono memorizzate, in codifica binaria, alcune informazioni utili sull’andamento della esecuzione come ad esempio: il risultato (vero o falso) dell’ultimo confronto effettuato, il verificarsi di un riporto o di un overflow nell’ultima operazione aritmetica eseguita, la positività o negatività del risultato dell’ultimo calcolo svolto. Tutte queste informazioni sono di tipo binario (si/no, 1/0) e occupano solo un bit ciascuna, quindi RS contiene una sequenza di bit ciascuno associato ad un tipo di informazione. Un possibile schema della ALU è quello della figura 1.4:
6
Architettura di un sistema di elaborazione F | igura 1.4.
Il registro AC è collegato al bus dati in quanto può contenere operandi dell’operazione da svolgere e risultati, rispettivamente provenienti e diretti verso altre posizioni di memoria (locale o centrale). Il registro RS è collegato al bus dati in quanto il suo contenuto può essere richiesto dall’unità di controllo per essere esaminato dopo una certa operazione. Le operazioni non previste dai circuiti, e quindi non eseguibili direttamente tramite l’hardware dell’elaboratore, devono essere programmate ed eseguite via software; ad esempio per fare il prodotto di due numeri, se non abbiamo un circuito che realizza la moltiplicazione, si deve programmare l’operazione come un ciclo di somme. In molti casi ciò è realizzato mediante ‘microprogrammi’ registrati su appositi circuiti di memoria; l’insieme dei microprogrammi prende il nome di ‘firmware’. La memoria dove vengono registrati i microprogrammi è di tipo ROM (Read Only Memory) e prende il nome di ‘memoria di controllo’. Le microistruzioni stanno ad un livello inferiore rispetto alle istruzioni macchina; queste ultime infatti vengono eseguite attivando l’apposito gruppo di microistruzioni (microprogramma).
1.3.4 CU La CU è ancora una RETE LOGICA progettata per eseguire ciclicamente il seguente processo suddiviso in tre fasi: 1. fase di FETCH: consiste nel prelevamento (lettura) di una istruzione dalla memoria centrale e nel suo trasferimento in un apposito registro della CPU, ‘l’instruction register’ (RI) dove viene messa a disposizione per la successiva fase; 2. fase di DECODE: consiste nell’individuazione, in base all’istruzione trasferita, della operazione da effettuare e su quali eventuali operandi; questa fase viene svolta da una unità di decodificazione a ciò adibita denominata ‘decodoficatore di istruzioni’; 3. fase di EXECUTE: in base alle segnalazioni della unità di decodifica, che ha interpretato l’istruzione nella fase precedente, l’unità di controllo vera e propria invia le «direttive» di esecuzione alla ALU che esegue l’operazione richiesta.
Architettura di un sistema di elaborazione
7
Questo ciclo si chiama ‘ciclo istruzione’ e si compone di diversi ‘cicli macchina’ con i quali vengono eseguite le varie fasi (fetch, decode, execute). Un ciclo macchina (o passo elementare di esecuzione) è l’intervallo tra due impulsi consecutivi del clock. Perché questo processo possa continuare ciclicamente è necessario che, al termine della esecuzione di una istruzione, l’unità di controllo sia in grado di determinare l’indirizzo della istruzione successiva (si ricordi, a questo proposito, che le istruzioni che compongono un programma in esecuzione sono memorizzate in posizioni adiacenti della memoria centrale). A questo scopo viene utilizzato un registro della CPU, il ‘program counter’ (PC), che contiene l’indirizzo della prossima istruzione da prelevare e viene aggiornato dopo la fase di decodifica aggiungendo al suo contenuto la lunghezza della istruzione corrente decodificata. La CU può essere schematizzata come nella figura 1.5: F | igura 1.5.
Il ciclo di esecuzione di un programma da parte della CPU può essere rappresentato con un diagramma di flusso come in figura 1.6: F | igura 1.6.
8
Architettura di un sistema di elaborazione
1.3.5 Memoria centrale Prima di illustrare la memoria centrale del sistema di elaborazione vengono fornite alcune nozioni sulle memorie in generale.
1.3.5.1 Struttura logica delle memorie Una memoria può essere rappresentata come un insieme di celle (o locazioni) che possono conservare porzioni elementari di informazione. Nelle celle sono possibili due tipi di operazione: «lettura» di informazione o «scrittura» di informazione; in generale si parla di «accesso» alla memoria quando si compie una delle due operazioni. Le memorie devono essere organizzate in modo da permettere la loro individuazione per l’effettuazione degli accessi; devono quindi avere un indirizzo univoco per ogni cella. Le memorie si possono classificare in base a varie caratteristiche; una classificazione molto importante viene effettuata in base alla modalità di accesso: • memorie ad ‘accesso uniforme’: in esse una cella è accessibile indipendentemente dalla sua posizione ed in un tempo uguale per tutte le celle presenti nella memoria (esempio memoria centrale); • memorie ad ‘acceso diretto’: in esse una cella è accessibile indipendentemente dalla sua posizione ma il tempo impiegato dipende da quest’ultima (esempio: memorie ausiliarie su disco); • memorie ad ‘accesso sequenziale’: in esse una cella è accessibile solo passando attraverso tutte le celle che la precedono (esempio: memorie ausiliarie su nastro o memorie ottiche).
Architettura di un sistema di elaborazione
9
1.3.5.2 Memoria centrale del sistema di elaborazione La memoria centrale RAM (Random Access Memory) è una memoria ad accesso uniforme; anche essa è una rete logica i cui circuiti sono progettati per conservare informazione in codifica binaria. La codifica binaria dell’informazione consiste nella rappresentazione di un simbolo alfanumerico mediante un gruppo di bit; la memoria allora viene organizzata in una sequenza di «gruppi di bit», o ‘posizioni’, o ‘parole’ (word) ognuna delle quali è individuata da un indirizzo. La grandezza della parola dipende dalla macchina ed è sempre un multiplo di 8 bit (1 byte); in certi casi la parola è 2 byte, in altri casi è 4 byte e talvolta si usano anche la mezza parola (half word) e la doppia parola (double word). La capacità della memoria centrale è molto importante in quanto, come si è detto, tutti i programmi che devono essere eseguiti devono esservi memorizzati; la grandezza della memoria è quindi un indice di potenza dell’elaboratore. L’unità di misura della memoria è il byte con i suoi multipli: Kappabyte (1 KB=1.024 byte), Megabyte (1 MB=1.048.576 byte), Gigabyte (1 GB= 1.073.741.824 byte), Terabyte (1 TB= 1.099.511.627.776 byte). Per quanto riguarda i circuiti per l’accesso alla memoria centrale si hanno: • un decodificatore degli indirizzi che riceve il suo input da un registro contenente l’indirizzo della parola a cui accedere; • un registro di indirizzamento in memoria (RIM) o MAR (Memory Address Register) contenente l’indirizzo cui accedere; • un registro di lettura e scrittura (RLS) o MBR (Memory Buffer Register) per immagazzinare la parola interessata al trasferimento e cioè la parola appena letta o da scrivere in memoria. Il tutto si può schematizzare come in figura 1.7: F | igura 1.7.
10
Architettura di un sistema di elaborazione
1.3.5.3 Ordinamento big endian e little endian dei dati in memoria Nel caso di posizioni di memoria costituite da più byte (ad esempio di 16 bit) l’ordine con cui i diversi byte di una stessa posizione sono memorizzati dipende dall’architettura del computer. I due ordinamenti più diffusi sono: • big endian o big end first: in questo caso le posizioni di memoria sono occupate a partire dal byte più a sinistra del dato, quindi dal più significativo; • little endian o little end first: in questo caso le posizioni di memoria sono occupate a partire dal byte più a destra del dato, quindi dal meno significativo. Da quanto detto emerge che nel caso di big endian il byte più significativo (MSB Most Significant Byte) ha l’indirizzo di memoria più piccolo, mentre nel caso di little endian è il byte meno significativo (LSB Least Significant Byte) ad avere l’indirizzo più piccolo. Ad esempio se si deve memorizzare il dato ’AB’ a partire dall’indirizzo 100, avremo, nel caso di big endian: |indirizzo 100: A |indirizzo 101: B
invece, nel caso di little endian: |indirizzo 100: B |indirizzo 101: A
I termini big endian e little endian derivano dai Lillipuziani dei "Viaggi di Gulliver", il cui problema principale era se le uova debbano essere aperte dal lato grande (big endian) o da quello piccolo (little endian); il significato di questa analogia è ovvio: nessuno dei due metodi è migliore dell’altro. Esiste comunque un problema di compatibilità noto come ‘NUXI problem’ dovuto al fatto che i processori Intel usano il metodo little endian e quelli Motorola il metodo big endian, si dice anche che hanno endianess deverse. Il termine NUXI deriva dall’aspetto che avrebbe la parola UNIX se memorizzata in due posizioni consecutive di due byte in little endian.
1.3.5.4 Ciclo di memoria Si chiama ‘ciclo di memoria’ la sequenza di azioni che il sistema compie per leggere o scrivere un dato in memoria. Ipotizzando che il metodo di ordinamento dei dati in memoria sia il big endian, abbiamo, nel caso della lettura: 1. L’indirizzo del dato viene posto nel MAR. 2. Il decodificatore di indirizzi accede alla posizione di memoria indirizzata. 3. Se viene letta una parola, il byte indirizzato dal MAR viene posto nella metà più significativa del MBR e il byte successivo viene posto nella metà meno significativa.
Architettura di un sistema di elaborazione
11
4. Se viene letto un byte viene posto nella metà meno significativa del MBR e l’altra metà viene riempita con copie del bit più significativo presente nel byte (meccanismo di ‘estensione del segno’). Nel caso della scrittura: 1. L’indirizzo della cella di memoria di destinazione viene posto nel MAR. 2. Il dato da memorizzare viene collocato nel MBR. 3. Se viene scritta una parola, il byte più significativo del MBR viene trasferito nella cella indirizzata dal MAR e il byte meno significativo viene posto nella cella successiva. 4. Se viene scritto un byte, la metà meno significativa del MBR viene trasferita nella cella di memoria indirizzata dal MAR.
1.3.5.5 Struttura fisica della memoria centrale La memoria centrale viene realizzata con materiale semiconduttore; ogni unità elementare di informazione o bit è di solito un ‘multivibratore bistabile’ (o ‘flip-flop’), cioè un circuito che può assumere uno di due diversi stati possibili in modo stabile finché un certo impulso non lo fa passare nell’altro stato. La lettura e la scrittura in memoria consistono nel rilevare lo stato del flip-flop e nell’inviargli impulsi per cambiarlo. Tali operazioni avvengono con la stessa velocità per tutti i circuiti della memoria ed in maniera indipendente dalla loro posizione; quindi la memoria centrale è una memoria ad accesso «casuale» (random) o «uniforme». Le tecnologie con cui vengono realizzati i circuiti di memoria sono però due e quella basata sui flip-flop non è, come vedremo, la più utilizzata: • memorie bipolari TTL (Transistor Transistor Logic); in esse un flip-flop viene ottenuto collegando almeno due transistor; in tal caso si ha una ‘RAM statica’ (SRAM) in quanto l’informazione rimane inalterata finchè non interviene un impulso a farla cambiare; • memorie a semiconduttori MOS (Metallo Ossido Semiconduttore) che richiedono un solo condensatore per ogni bit, se carico corrisponde al valore uno, altrimenti a zero; sono più compatte ma meno veloci e necessitano di circuiti aggiuntivi per il continuo «refresh» dei valori perché i condensatori tendono a scaricarsi nel tempo (in pochi millisecondi). Tale tipo di memoria è detto ‘RAM dinamica’ (DRAM). La RAM statica è più veloce ma anche molto più costosa; per questo motivo la memoria centrale di un computer è realizzata con RAM dinamica mentre la RAM statica viene utilizzata per la memoria ‘cache’.
1.3.5.6 Memoria cache La cache è una memoria più piccola della memoria centrale ma anche più veloce. Nei moderni personal troviamo almeno due memorie cache: quella di primo livello (L1) grande alcuni KB, inglobata all’interno della CPU e veloce quanto la CPU e quella di secondo livello, grande qualche MB, situata esternamente alla CPU, meno veloce ma comunque più veloce della memoria centrale.
12
Architettura di un sistema di elaborazione
Il loro ruolo è quello di interporsi tra CPU e RAM allo scopo di immagazzinare dati e istruzioni che si ritiene possano servire alla CPU per le operazioni immediatamente successive, onde evitare che debbano essere letti nella più lenta memoria centrale. Per questo la CPU cerca dati e istruzioni prima nella memoria cache L1 e poi nella L2 e solo in caso di insuccesso accede alla memoria centrale; inoltre quando una cella viene letta dalla RAM, il suo contenuto viene portato, oltre che alla CPU, anche nelle memorie cache, insieme a quello delle celle limitrofe. Prima di proseguire nell’esame dei principi di funzionamento della cache presente nell’unità centrale, soffermiamoci brevemente sul concetto più generale di «cache» che incontriamo anche in altri ambiti informatici. In generale una cache è una memoria tampone che si colloca (logicamente) fra due entità informatiche fra cui avviene uno scambio di dati e che sono notevolmente diverse dal punto di vista della velocità; il suo ruolo è quello di sopperire alla lentezza dell’entità meno veloce ospitando parte dei dati che da questa devono essere trasferiti all’entità più veloce riducendone quindi i tempi di attesa. Vediamo un paio di esempi in ambiti diversi da quello dell’unità centrale: • la cache del disco fisso: in questo caso l’entità lenta è il disco, quella veloce l’unità centrale e una parte della memoria centrale viene usata come cache del disco per cercare di rendere più rapidi i trasferimenti da quest’ultimo all’unità centrale; • la cache dei programmi di navigazione in Internet: in tal caso l’entità lenta è Internet (o meglio il collegamento alla rete), quella veloce è il programma di navigazione e una parte del disco fisso viene usata come cache per ospitare le pagine Web visitate e renderle rapidamente disponibili in caso di visita successiva. Tornando alla cache dell’unità centrale notiamo che la sua utilità è giustificata dalla validità, verificata sperimentalmente, dei seguenti due principi: • ‘pricipio di località degli accessi nello spazio’: se la CPU accede ad una cella, molto probabilmente negli istanti successivi accederà alle celle vicine; ciò deriva dal fatto in moltissimi programmi si gestiscono ‘vettori’, cioè insiemi di dati memorizzati in celle consecutive; • ‘pricipio di località degli accessi nel tempo’: se la CPU accede ad una cella, molto probabilmente negli istanti successivi accederà di nuovo a quella cella; ciò deriva dal fatto che moltissimi programmi contengono ‘cicli’ cioè istruzioni che vengono eseguite ripetutamente in breve tempo. La presenza della memoria cache permette di velocizzare gli accessi in lettura alla RAM; non c’è invece alcun miglioramento per gli accessi in scrittura. A tale proposito ci sono due metodologie di gestione della cache: • ‘write back’: i dati da memorizzare vengono scritti solo in cache e in un momento successivo anche nella memoria centrale; è un metodo più complesso e con qualche rischio di «disallineamento» dei dati, ma che assicura maggiore velocità di scrittura; • ‘write through’: i dati da memorizzare vengono scritti contemporaneamente nella cache e nella memoria centrale; è un metodo meno complesso ma leggermente più oneroso riguardo ai tempi di accesso.
Architettura di un sistema di elaborazione
13
1.3.5.7 Memorie ROM Sie le memorie SRAM che le DRAM sono «volatili» cioè perdono il loro contenuto se viene a mancare l’alimentazione elettrica. Esistono anche memorie non volatili come le ROM citate in precedenza; più in dettaglio abbiamo: • ROM: memorie in sola lettura che vengono scritte in fabbrica e non permettono in nessun modo di essere riscritte; • PROM (Programmable ROM): memorie ROM che possono essere scritte, una sola volta, con apparechiature apposite; • EPROM (Erasable Programmable ROM): memorie ROM che possono essere cancellate e riscritte con apparechiature apposite grazie all’esposizione del chip a raggi ultravioletti; • EEPROM (Electrically Erasable Programmable ROM): memorie ROM che possono essere cancellate e riscritte elettricamente direttamente sul computer dove sono utilizzate senza la necessità di rimuoverle e usare altri dispositivi. In questa tipologia di memorie rientrano anche le ‘memorie flash’ che si stanno diffondendo molto rapidamente come memorie ausiliarie per i computer (ad esempio penne USB) o supporti di memorizzazione nell’elettronica di consumo (ad esempio shede per fotocamere e videocamere digitali); la differenza fondamentale tra una memoria EEPROM «tradizionale» e una memoria flash è nel fatto che alla prima si accede a livello di singole celle o parole, mentre alla seconda si accede «a blocchi» come avviene per i dischi fissi.
14
Capitolo
Architettura del sistema AMC
2
L’AMC è un sistema di elaborazione progettato a scopi didattici che cerca di assicurare la chiarezza e la sintesi necessari a tali scopi senza discostarsi troppo dalle caratteristiche di alcuni sistemi reali. Per gli scopi di queste dispense non è necessario descrivere le periferiche del sistema e quindi l’AMC risulta privo di tali dispositivi; in pratica può essere considerato un modello teorico di unità centrale di elaborazione.
2.1 Struttura dell’AMC Come tutti i sistemi, l’AMC può essere visto come un insieme di unità funzionali collegate tra loro da vari bus (di dati, indirizzi, controllo). Nella figura 2.1 si può vedere una possibile rappresentazione dell’AMC non contenente, per semplicità i collegamenti di controllo. F | igura 2.1.
Il processore dell’AMC è a 16 bit, le operazioni e i trasferimenti interni sono quindi con ‘parole’ di 16 bit. Anche i due bus interno e esterno sono a 16 bit e vengono utilizzati per dati e indirizzi. Ne consegue che la memoria indirizzabile dall’AMC ammonta a 65536 posizioni (64K). Le porte di input/output operano invece con unità di 8 bit in accordo con la grande maggioranza delle porte per i dispositivi periferici dei sistemi reali.
2.2 Memoria dell’AMC L’unità di memoria comprende: la memoria centrale, un decodificatore di indirizzi, un registro di indirizzamento o MAR (Memory Address Register), un registro dati o MBR (Memory Buffer Register). La sua funzione è di registrare e restituire dati e istruzioni; il dialogo con il resto dell’AMC avviene tramite il bus esterno (figura 2.2).
Architettura del sistema AMC
15
F | igura 2.2.
La memoria centrale dell’AMC è costituita da un insieme di locazioni o celle omogenee identificate da un ‘indirizzo’. Il registro MAR è ovviamente a 16 bit; lo stesso il registro MBR dal quale transitano i dati da leggere o scivere. La lettura e la scrittura possono però avvenire sia per byte che per parole: una parola occupa due celle consecutive di memoria ed è localizzata sempre usando l’indirizzo del byte inferiore. Quindi per l’AMC l’ordinamento dei dati in memoria è il big endian.
2.3 ALU dell’AMC Nell’unità aritmetico logica o ALU (Arithmetic and Logic Unit ) troviamo un registro ‘accumulatore’, un insieme di ‘circuiti logici’, un ‘registro di risultato’ e un ‘registro di stato’ (figura 2.3).
F | igura 2.3.
L’accumulatore contiene, di volta in volta, il dato da elaborare.
16
Architettura del sistema AMC
I circuiti logici hanno due input e un output e sono collegati ai bit di condizione del registro di stato. Consistono di un sommatore, un registro a scorrimento, porte NOT, AND, OR, XOR. Tutte le elaborazioni sono a 16 bit. Il registro di risultato serve a parcheggiare temporaneamente l’output dei circuiti logici. Il registro di stato (o dei flag) contiene 4 bit di condizione il cui valore dipende dall’ultima operazione svolta dai circuiti logici. I quattro bit di stato sono: • zero (Z), vale uno se l’ultima operazione svolta ha output zero; • negativo (N), vale uno se l’ultima operazione svolta ha output negativo (bit più significativo del risultato uguale a 1); • carry (C), vale uno se c’è un riporto dal bit più significativo dopo una somma o uno shift; • overflow (V), vale uno se una somma produce un overflow.
2.4 Unità di Input/Output dell’AMC L’AMC comunica con le periferiche attraverso una unità contenente un ‘registro di input’ un ‘registro di output’ e un ‘registro di selezione’ del dispositivo periferico, tutti collegati al bus esterno e contenenti 8 bit; quindi l’input e l’output avvengono a caratteri o byte (figura 2.4). F | igura 2.4.
Nel caso si effettui l’input di un carattere la sequenza delle operazioni da compiere è: 1. Nel registro di selezione viene posto l’identificativo del dispositivo interessato. 2. A tale dispositivo viene richiesto di trasferire un carattere nel registro di input. 3. Quando il registro di input è caricato viene inviato un segnale all’unità di controllo dell’AMC. 4. Il carattere viene quindi trasferito e reso disponibile per le operazioni successive.
Architettura del sistema AMC
17
Nel caso dell’output di un carattere invece: 1. Il carattere viene posto nel registro di output. 2. Nel registro di selezione viene posto l’identificativo del dispositivo interessato. 3. A tale dispositivo viene richiesto di copiare il carattere dal registro di output. 4. Quando il carattere è copiato dal registro di output viene inviato un segnale all’unità di controllo dell’AMC.
2.5 Unità di controllo dell’AMC Nell’unità di controllo o CU (Control Unit) dell’AMC ci sono il ‘decodificatore di istruzioni’ e quattro registri: ‘program counter (PC), instruction register (IR), stack pointer (SP), index register (XR)’. La CU contiene anche un generatore di impulsi o ‘clock’ che ha il compito di temporizzare le attività del sistema (figura 2.5). F | igura 2.5.
Il compito della CU è controllare le operazioni svolte dal processore per eseguire le istruzioni di un programma; in dettaglio: 1. Controllare la sequenza di esecuzione delle istruzioni. 2. Controllare l’accesso alla memoria centrale. 3. Regolare la tempificazione delle operazioni del processore. 4. Scambiare segnali di controllo con le unità periferiche. Il ruolo dei componenti della CU è il seguente: Il PC contiene l’indirizzo della successiva istruzione da eseguire; infatti dopo la lettura dalla memoria di una istruzione, il valore di PC viene aumentato di un valore opportuno in modo da fare riferimento all’indirizzo della successiva istruzione. Il valore dell’incremento dipende dalla lunghezza dell’istruzione corrente; nell’AMC ci sono istruzioni da 2, 3 o 4 byte.
18
Architettura del sistema AMC
Il registro IR contiene l’istruzione attualmente in esecuzione; essa viene interpretata dal decodificatore di istruzioni, il quale, di conseguenza, attiva opportuni segnali di controllo su altri componenti del processore per far svolgere quanto richiesto dall’istruzione stessa. Il registro SP serve a indirizzare una particolare area di memoria che il processore utilizza come una pila (stack) Il registro XR serve a permettere un particolare metodo di indirizzamento della memoria: l’indirizzamento indicizzato o indexato (vedere paragrafo 5.4 sui modi di indirizzamento). Il clock produce, ad intervalli regolari, dei segnali su varie linee di controllo volti ad abilitare certi componenti del processore; questo assicura la temporizzazione delle sue attività. In figura 2.6 viene proposto lo schema completo del sistema AMC. F | igura 2.6.
19
Capitolo
Il Personal Computer
3
Il PC o Personal Computer è senza dubbio il tipo di sistema di elaborazione più conosciuto e utilizzato da molti anni a questa parte; grazie al suo avvento, risalente aegli anni ’80 del secolo scorso, si è assistito alla diffusione dell’informatica come fenomeno di massa. In questa sede non ci soffermiamo sulla storia di questo strumento, sui motivi del suo successo e sulle prospettive future relative al suo utilizzo, ma prendiamo brevemente in esame i suoi componenti fondamentali esaminando le tecnologie su cui essi sono basati e i loro principi di funzionamento. Essendo il settore dei PC in continua e velocissima evoluzione, è bene chiarire che le tecnologie illustrate in questo capitolo sono quelle in essere nella prima metà del 2008; sicuramente nel giro di qualche mese alcune di esse saranno superate o sostituite da altre più innovative. Quello che resta però valido è il modello della macchina di Von Neumann che rimane alla base della struttura logica anche degli attuali Personal Computer; possiamo dire che essi sono una moderna evoluzione delle idee di Von Neumann e al loro interno troviamo ancora, tra gli altri compnenti, gli elementi fondamentali che erano presenti nel modello: unità di controllo e di calcolo (riunite nella CPU), memoria centrale (RAM), bus di comunicazione, dispositivi periferici o di I/O (input/output).
3.1 La scheda madre del PC La scheda madre (main board) è sicuramente un componente fondamentale di un PC in quanto ha il compito di coordinare i passaggi di informazioni fra i vari dispositivi e costituisce anche il supporto fisico cui tali dispositivi sono inseriti o collegati. Si tratta solitamente di un supporto in fibra di vetro di forma rettangolare su cui scorrono, su più livelli, delle piste in rame. Viene usata la fibra di vetro, che è un cattivo conduttore, per fare in modo che i vari componenti della scheda siano isolati l’uno dall’altro. Nella figura 3.1 viene proposto un esempio di scheda abbastanza recente; le lettere sono state inserite per contrassegnare i vari componenti a cui faremo riferimento nel proseguo. F | igura 3.1.
20
Il Personal Computer
Alcuni dei collegamenti elettrici assicurati dalle piste in rame servono a trasportare informazioni e sono quindi i bus di cui abbiamo parlato in precedenza; altri collegamenti portano invece l’alimentazione ad alcuni dispositivi. I dispositivi che necessitano di maggiore energia sono comunque serviti direttamente dall’alimentatore del PC che alimenta anche la scheda madre grazie al connettore contrassegnato dalla lettera ‘A’ di figura 3.1. L’alimentatore che trasforma la corrente alternata da 220 volts della normale rete elettrica in corrente continua da 12 volts (per i dischi fissi dei PC non portatili), 5 e 3,3 volts (per la maggior parte degli altri componenti). Sulla scheda madre sono presenti alcuni elementi da usare per collegare i dispositivi: connettori, slot, socket e un insieme di ‘porte’ che si affacciano verso l’esterno; grazie ad essi si possono collegare alla scheda madre la CPU, la RAM, le varie periferiche. Inoltre alcuni componenti o chip (elementi in plastica nera o ceramica della grandezza di un francobollo con piedini o PIN in metallo) sono direttamente saldati sulla scheda e sono quindi ad essa indissolubilmente legati, visto che non possono essere sostituiti. La scelta della scheda madre è importante perché è fortemente legata a quella della CPU; infatti un certo modello di processore potrà essere utilizzato solo su schede madri progettate per accoglierlo e non su altre di tipo diverso. Anche la scelta del tipo e della quantità di memoria RAM utilizzabile dipende fortemente dalle caratteristiche della scheda madre, mentre per altri dispositivi c’è un legame meno stretto (ad esempio se una scheda madre dispone di slot PCI dovrebbe poter accogliere qualsiasi scheda compatibile con questo standard).
Il Personal Computer
21
3.1.1 Fattore di forma della scheda madre Le schede madre si differenziano per il ‘fattore di forma’ che è un insieme di informazioni su forma, dimensione, disposizione dei componenti. Durante la storia dei PC i fattori di forma si sono via via evoluti con l’obiettivo di razionalizzare la disposizione dei componenti interni della macchina e di migliorare i flussi d’aria interni per facilitare il raffreddamento dei dispositivi più soggetti a surriscaldarsi (CPU, dischi fissi). Attualmente il fattore di forma più diffuso è ATX, che è anche quello della scheda della figura precedente, mentre lo standard del futuro sarà il BTX.
3.1.2 Il chipset della scheda madre Su ogni scheda madre è presente un insieme di circuiti che prende il nome di chipset con lo scopo di supportare la CPU, la memoria, la cache e di assicurare le comunicazioni attraverso i bus. Si deve sottolineare che un chipset è realizzato per il supporto ad una specifica famiglia di processori, cosa che contribuisce a rendere esclusivo il legame fra un certo modello di scheda madre e un certo tipo di CPU. Nei casi più comuni il chipset è costituito da due soli chip: • northbridge: ha il compito di interfacciarsi con i componenti più veloci (CPU, memoria, interfaccia grafica AGP o PCI-Express); • southbridge: si interfaccia con i componenti meno veloci (slot PCI, canali EIDE, porte USB ecc.) Fra i due il chip più importante è sicuramente il northbridge che è anche quello che si differenzia in base al processore (ci sono cioè dei chipset diversi in cui il southbridge è lo stesso), è più veloce e realizzato con una tecnologia più «spinta» e quindi spesso necessita di un dispositivo di raffreddamento. A tale proposito specifichiamo che i dispositivi di raffreddamento possono essere attivi come le ventole, o passivi come i dissipatori; sul northbridge viene di solito applicato un dissipatore e questo permette anche di distinguerlo dal southbridge che ne è sprovvisto. Nella figura 3.1 i due chip sono contrassegnati rispettivamente dalle lettere ‘B’ (coperto dal dissipatore) e ‘C’. Nella figura 3.2 vediamo invece uno schema dei collegamenti del chipset. F | igura 3.2.
22
Il Personal Computer
3.1.3 Bus di sistema e bus di I/O Il bus di sistema è il bus (indirizzi, dati e controllo) utilizzato dai componenti veloci della macchina ed è suddiviso in FSB (Front Side Bus) che collega la CPU, la memoria e la scheda video al northbridge e BSB (Back Side Bus) che collega la CPU alla memoria cache. I bus di I/O sono gestiti dal southbridge e ne esistono vari tipi. Tutti questi bus e, come già sappiamo, anche la CPU, funzionano in modo sincrono grazie alla presenza di dispositivi di temporizzazione chiamati clock. Il clock più «famoso» è quello della CPU, ma il più importante è quello del FSB in quanto gli altri vengono impostati in base ad esso: il clock della CPU come multiplo (anche non intero) e quello del bus di I/O come sottomultiplo. Si noti anche che il bus più veloce in assoluto è il BSB che lavora alla stessa frequenza della CPU. Esaminiamo ora brevemente alcuni bus di I/O tralasciando i vecchi bus ISA (Industry Standard Architecture), EISA (Extended ISA), VESA (Video Electronics Standards Association), caduti in disuso ormai da alcuni anni: • PCI (Peripheral Component Interconnection): collega il northbridge al southbridge e mette a disposizione degli slot di espansione (contrassegnati dalla lettera ‘D’ nella figura 3.1) in cui inserire shede audio, schede di rete o di altro tipo; inizialmente il bus aveva ampiezza di 32 bit, velocità di 33 Mhz e banda massima di 133 MBps (Mega Byte per secondo) tutti parametri incrementati nelle versioni successive fino ai valori rispettivamente di 64 bit, 66 Mhz e 533 MBps; • PCI-X (PCI eXtended): sviluppato per schede di livello superiore che equipaggiano workstation grafiche o server; attualmente questo bus ha raggiunto una larghezza di 64 bit, una velocità di 533 Mhz e una banda massima di 4266 MBps; • AGP (Accelerated Graphics Port): pur essendo un evoluzione dello slot PCI non è da considerare un bus ma un collegamento ‘punto a punto’ tra la scheda grafica (che quindi deve essere unica in ogni PC) e il northbridge; è stato inventato per soddisfare le grosse esigenze di velocità e di banda disponibile della grafica a tre dimensioni passando dalla prima versione (AGP 1X) con banda di 266 MBps alla più recente (AGP 8X) con banda di
Il Personal Computer
23
2,1 GBps; il suo colore è grigio o verde ed è quello indicato con la lettera ‘E’ nella figura 3.1; • PCMCIA (Personal Computer Memory Card International Association): è il bus per connettere schede (del formato di una carta di credito) ai PC portatili o notebook; attualmente sta perdendo di importanza in quanto da un lato alcune funzionalità un tempo assicurate da tali schede sono ora integrate nelle schede madri, mentre altre si ottengono collegando dispositivi alle porte esterne USB; • PCI Express: è il successore del PCI e del PCI-X; è con essi retrocompatibile ma ne modifica ampiamente il funzionamento in quanto il trasferimento dati è seriale e non più parallelo, ha velocità di clock più alte ed è bidirezionale in simultanea. Diamo qualche altra informazione sul nuovo bus PCI Express: gli slot PCI Express possono essere 1X, 8X, 12X, 16X, con frequenza di clock da 5Ghz a 80 Ghz e banda da 250 MBps a 4 GBps; gli slot 8X e 12X si trovano soprattutto sui server mentre i 16X sono dedicati alle schede grafiche, in sostituzione del vecchio slot AGP, e possono essercene due in ogni scheda madre dando quindi la possibilità di installare due schede grafiche dividendo tra esse il carico di lavoro. La modifica più rilevante dovuta all’introduzione del PCI Express è però a livello di progettazione del chipset in quanto il nuovo bus si colloca (almeno in parte) a un livello più alto (è collegato al northbridge) rispetto al vecchio PCI (collegato al southbridge). Entrando leggermente più in dettaglio possiamo osservare che lo standard mette a disposizione un certo numero di canali seriali bidirezionali (lanes), ad esempio 20, che possono essere aggregati in un gruppo da 16 (16X) per la scheda grafica, collegato al northbridge e quattro gruppi da 1 (1X) per i normali slot PCI Express collegati al southbridge. I connettori PCI Express crescono di dimesione dal 1X al 16X e sono tra loro compatibili in senso crescente (cioè una scheda 1X può essere collegata ad uno slot 2X ma il viceversa è ovviamente impossibile). Nella scheda madre di figura 3.1 non ci sono slot di questa nuova generazione; essi sono comunque ancora di colore bianco come i PCI ma con il lato corto dello slot posto al contrario in modo che sia impossibile inserire una scheda PCI in uno slot PCI Express o viceversa.
3.1.4 Componenti integrati e altri elementi nella scheda madre In una scheda madre si trovano di solito una serie di componenti direttamente integrati; questo permette di risparmiare sui costi del sistema ma impedisce la loro sostituzione; come esempi possiamo citare il chip audio, il chip di rete e, in caso di sistemi particolarmente economici e/o portatili, il chip grafico. La presenza di un chip integrato non impedisce comunque l’utilizzo di una scheda di espansione, presumibilmente più potente, che lo sostituisca dal punto di vista funzionale: ad esempio possiamo senz’altro installare una scheda audio PCI, con caratteristiche di gestione del suono professionali, da usare al posto del chip audio integrato (in tal caso può essere necessario disattivare quest’ultimo dalle impostazioni del BIOS della macchina). Concludiamo questo breve esame di una scheda madre di un PC indicando la posizione nella figura 3.1 di alcuni altri elementi importanti il cui ruolo verrà approfondito nei paragrafi successivi: con la lettera ‘F’ è indicato il socket per l’alloggiamento della CPU; con la lettera ‘G’ gli slot per inserire i moduli di memoria RAM; con la lettera ‘H’ i connettori EIDE per i dischi; con la lettera ‘I’ il connettore per il lettore di dischetti; con la lettera ‘J’ l’alloggiamento per la batteria a bottone utile tra l’altro per la conservazione della data e dell’ora di sistema; con le lettere ‘K’
24
Il Personal Computer
alcune connessioni e porte esterne, da sinistra a destra: le porte ‘ps2’ per tastiera e mouse, porte parallele e seriali, porte USB, connessioni audio.
3.2 Il processore La storia dei processori è indissolubilmente legata a quella dell’azienda ‘Intel’ creatrice nel 1971 del 4004, la prima CPU, nel 1981 dell’8086 che ha equipaggiato i primi PC, e tutt’ora maggiore produttrice mondiale di microprocessori; qui si farà dunque principalmente riferimento alle CPU della famiglia ‘x86’ di cui è capostipite, appunto, l’8086 e che comprende tutte le CPU fino al Pentium IV rimasto in produzione fino al 2006 nonché i moderni processori a 64 bit con core multipli. Questo non significa che non esistano processori prodotti da altre aziende, basti citare gli «storici» Zilog Z80 e Motorola 68000; nel settore degli attuali PC sono abbastanza diffuse le CPU prodotte dalla AMD, che sono compatibili con quelle della Intel. In queste dispense non vogliamo entrare nei dettagli delle caratteristiche dei vari nodelli di microprocessori Intel (e AMD) che si sono via via succeduti o che sono attualmente in commercio, anche perché queste informazioni sono già obsolete o destinate a diventarlo in breve tempo, ci limitiamo invece ad esporre i concetti di base sulla loro realizzazione, la loro architettura interna e il loro funzionamento. Un microprocessore è un core inserito in un package di ceramica (figura 3.3) e contenente milioni di transistor che si possono considerare raggruppati in: • unità di controllo e di predizione delle istruzioni; • unità di esecuzione o ALU e unità per i calcoli in virgola mobile o FPU (Floating Point Unit); • memoria locale, costituita dall’insieme dei registri; • memoria cache di primo livello o L1; • interfaccia di collegamento con l’esterno o FSB (Front Side Bus). F | igura 3.3.
Notiamo che la FPU non è sempre stata integrata nella CPU; ciò è avvenuto, per i processori Intel, a partire dal 80486, prima era un chip separato e opzionale chiamato ‘coprocessore matematico’ (ad esempio per l’80386 esisteva il coprocessore 80387). Nei processori moderni invece troviamo integrate addirittura più FPU (oltre che più ALU). Le caratteristiche più rilevanti dei processori possono essere così elencate:
Il Personal Computer
25
• ampiezza in bit dei registri; • frequenza del clock; • tecnologia costruttiva; • il numero di piedini (pin); • gestione della memoria; • architettura; • tipo di istruzioni eseguibili.
3.2.1 Ampiezza in bit dei registri della CPU Riguardo all’ampiezza in bit dei registri si è passati dai 4 bit del processore 4004, ai 16 bit dell’8086, ai 32 bit della famiglia di processori IA-32 (Intel Architecture 32), che è stata alla base di tutti i processori dal 80386 nel 1985 fino ai Pentium IV, per arrivare ai 64 bit dei processori Intel 64 come i moderni multicore o degli IA-64 (Intel Architecture 64) come l’Itanium. Quando si afferma che una CPU è «a x bit» si intende proprio dire che l’ampiezza dei suoi registri è x bit; quindi le attuali CPU a 64 bit hanno registri di tale dimensione; l’ampiezza dei bus dati e indirizzi invece non è determinante a questo proposito (ci si può rendere conto di questo osservando i dati contenuti nella tabella 3.6 presente nel paragrafo 3.2.8 sulle generazioni delle CPU).
3.2.2 Frequenza del clock della CPU La frequenza del clock della CPU ha avuto continui incrementi: l’8086 aveva un clock a 8 Mhz, il valore massimo si è raggiunto nel 2005 con il Pentium IV Extreme Edition con clock a 3,73 Ghz, poi i produttori di CPU hanno cessato di spingere verso l’alto la frequenza del clock per i motivi che vedremo nel paragrafo 3.2.9 dedicato ai processori con core multipli. Ricordiamo comunque che la frequenza del clock della CPU deve essere un multiplo, anche non intero, della frequenza del FSB della scheda madre e questo un altro elemento che lega fortemente una CPU alla scheda che la ospita.
3.2.3 Tecnologia costruttiva dei processori (legge di Moore) La parte funzionale di una CPU è il core grande qualche millimetro quadrato e ottenuto immergendo un cristallo purissimo di silice in un bagno di silice in un ambiente sterile ed estraendolo con molta lentezza; questo permette di ottenere un cilindro di silice purissima che viene poi tagliato, con lame di diamante, in dischi del diametro di 30 cm chiamati wafer (figure 3.4 e 3.5). F | igura 3.4.
26
Il Personal Computer F | igura 3.5.
Su tali dischi vengono creati i transistor e i collegamenti su vari livelli o layer, grazie a ripetuti processi di ‘fotolitografia’ e ‘drogaggio’. Con la fotolitografia, grazie a delle maschere e a una apposita luce, viene rimosso il silicio dalle parti non mascherate creando così i circuiti secondo l’impronta delle maschere. I transistor vengono poi collegati, livelli superiori, con minuscoli fili in rame che devono essere necessariamente isolati in uno spazio ristrettissimo; per questo viene usato il silicio drogato con apposite sostanze in modo da evitare qualsiasi conduzione di corrente e da avere una elevata resistenza al calore che si sviluppa all’interno della CPU. Al termine, i singoli chip che sono stati creati, denominati die vengono tagliati dal disco e montati sul supporto ceramico o package. I transistor di un core vengono misurati in base alla lunghezza del ‘canale di gate’; minore è questa lunghezza, misurata in micron, e meglio è, in quanto diminuisce la distanza tra ‘drain’ e ‘source’ (qui non approfondiamo ulteriormente natura e funzionamento di un transistor) con i seguenti vantaggi: • maggiore velocità della CPU; • minore dissipazione di energia perché ci sono minori capacità parassite; • minore tensione di lavoro e quindi minore consumo di energia (e minore surriscaldamento). Si parla si «tecnologia costruttiva» di un core intendendo la grandezza in micron dei transistor al suo interno; questa grandezza è in costante diminuzione e comporta il parallelo incremento del numero di transitor contenuti nel processore. Le tecnologie più recenti sono state a 0,09 micron (o 90 nanometri) per gli ultimi Pentium IV e 0,065 micron (o 65 nanometri) per i nuovi processori a doppio core che contengono circa 300 milioni di transistor e permettono di inserire nel package anche la memoria cache L2, oltre alla L1 che era già inglobata dal molto tempo. Attualmente Intel è già passata alla tecnologia a 0,045 micron mentre AMD prevede di adeguarsi a fine 2008.
Il Personal Computer
27
Per rendersi conto di quali limiti stia raggiungendo la tecnologia produttiva dei microprocessori si pensi che nei transistor di 45 nanometri il gate ha uno spessore di 1 nanometro corrispondente a soli 4-5 atomi di silicio (ogni atomo di silicio misura 0,22 nanometri). A questo proposito è interessante anche citare la ‘legge di Moore’ concepita nel 1965 da Gordon Moore che tre anni dopo sarebbe stato uno dei fondatori della Intel; si tratta di una legge empirica che nella sua prima versione afferma: «il numero dei transistor in un processore raddoppia ogni 12 mesi». Questa legge si è dimostrata sostanzialmente corretta anche se venti anni dopo è stata leggermente rivista assumendo la seguente forma: «le prestazioni dei processori raddoppiano ogni 18 mesi». Grazie ai continui miglioramenti nella tecnologia realizzativa delle CPU si è potuta abbassare anche la tensione di alimentazione (cosa molto importante specialmente per i notebook); le prime CPU venivano alimentate con tensioni di 5 volts, attualmente siamo scesi sotto i 2 volts.
3.2.4 Numero di pin della CPU Riguardo ai piedini (pin) si deve notare che i processori più recenti non hanno più i pin ma dei fori sul package; infatti i vecchi package PGA (Pin Grid Array) sono stati sostituiti dai LGA (Land Grid Array) per i quali è previsto che i pin siano sul socket della scheda madre. Ovviamente un processore può essere installato solo su un socket adatto ad ospitarlo; a tale proposito i socket sono identificati da un numero che non è altro che la quantità di fori (o di pin) presenti sul socket stesso. Nella figura 3.1 il socket è indicato con la lettera ‘F’.
3.2.5 Gestione della memoria da parte della CPU La quantità di memoria gestibile dipende dall’ampiezza del bus indirizzi: si va dai 20 bit dell’8086, ai 32 o 36 bit delle CPU IA-32, ai 64 bit dei processori attuali. I processori Intel usano, per la memorizzazione, la convenzione little endian con l’eccezione delle CPU Intel Itanium, per le quali può essere scelta anche la convenzione big endian impostando opportunamente un bit del registro di stato. Inoltre le CPU Intel (e compatibili) gestiscono la memoria in modo ‘segmentato’ cioè tramite la sua suddivisione in parti, chiamate appunto segmenti; una cella in questo caso viene individuata indicando l’indirizzo iniziale del segmento e l’offset della cella, cioè la sua distanza dall’inizio del segmento; questi valori vengono espressi solitamente in esadecimale nella forma «segmento:offset». Questa organizzazione si contrappone a quella ‘lineare’ o piatta (flat) adottata ad esempio dalle CPU Motorola, nella quale ogni cella è individuata semplicemente dal suo indirizzo. Il motivo di questa scelta, operata dalla Intel, che comporta una gestione della memoria senz’altro molto più complessa, va fatto risalire all’avvento dell’8086: in esso infatti il bus indirizzi era di 20 bit e quindi la memoria gestibile ammontava a 1 MB; per conservare la retrocompatibilità con il processore precedente, l’8080 che era a 8 bit ma aveva il bus indirizzi a 16 bit e quindi una memoria indirizzabile di 64 KB, fu deciso di dividere idealmente la memoria dell’8086 in 65536 segmenti parzialmente sovrapposti grandi ognuno 64 KB. Questo è anche il motivo per cui tutti i processori Intel e compatibili prevedono un insieme di registri che si chiamano ‘registri di segmento’.
28
Il Personal Computer
Per individuare a quale cella fisica di memoria corrisponda un indirizzo espresso in modo segmentato occorre effettuare un semplice calcolo: si moltiplica per 16 l’indirizzo del segmento (a questo scopo basta aggiungere uno zero alla sua destra) e poi si somma con l’offset. A titolo di esempio consideriamo l’indirizzo segmentato A0E3:1B56, e facciamo quindi la somma tra A0E3016 e 1B5616 ottenendo A298616. Come detto i segmenti di memoria dell’8086 sono parzialmente sovrapposti e ognuno inizia 16 locazioni di memoria dopo il precedente; come conseguenza di questo fatto abbiamo che una stessa cella di memoria può essere referenziata in più modi, con con indirizzi segmentati diversi. Notiamo anche che le CPU x86 sono ‘non ortogonali’ intendendo per ortogonale un processore in cui i registri sono non specializzati. Ad esempio nell’8086 abbiamo 14 registri con ruoli ben definiti (che qui non vengono approfonditi): • 4 registri di segmento: CS, DS, SS, ES; • 4 registri accumulatori o generali: AX, BX, CX, DX, di cui si possono utilizzare anche le rispettive metà, «alta» e «bassa», da 8 bit, identificate con AH, AL, BH, BL, CH, CL, DH, DL; • 2 registri indice: DI e SI; • 2 registri per la gestione della pila o stack: SP e BP; • il registro FLAGS o registro di stato; • il registro contatore di programma, qui denominato IP (Instruction Pointer).
3.2.6 Architetture dei processori (pipeline e predizione) Le architetture dei processori possono essere classificate in base al grado di parallelismo che permettono in fase di elaborazione; abbiamo le seguenti possibilità: • SISD (Single Instruction Single Data): viene eseguita una istruzione alla volta e si preleva e memorizza in memoria un solo dato alla volta; questa in pratica è l’architettura «classica», sequenziale proposta da Von Neumann ma ormai non più adottata in nessuna CPU reale; • MISD (Multiple Instruction Single Data): vengono eseguite istruzioni diverse contemporaneamente, ognuna sui propri dati (meccanismo del pipelining); • SIMD (Single Instruction Multiple Data): viene eseguita contemporaneamente la stessa operazione su più dati; è quello che avviene grazie alle istruzioni MMX (MultiMedia eXtension) introdotte da Intel all’epoca del processore Pentium per accellerare le applicazioni multimediali e poi migliorate, a partire dal Pentium III, dalle istruzioni SSE (Streaming SIMD Enhancement); • MIMD (Multiple Instruction Multiple Data): è l’architettura dei sistemi multiprocessore (o ‘multicore’) in cui ogni processore può operare autonomamente; in questo caso si parla di ‘elaborazione parallela’. Soffermiamoci in particolare sull’architettura MISD basato sul concetto di pipeline o catena di montaggio.
Il Personal Computer
29
L’obiettivo è quello di diminuire il tempo di elaborazione di un insieme di istruzioni senza aumentare il numero di processori coinvolti (senza ricorrere cioè al calcolo parallelo): si considerano le operazioni da svolgere come scomponibili in parti più elementari o ‘fasi’ e l’unità di elaborazione organizzata in n ‘stadi’ collegati in sequenza proprio come nelle catene di montaggio con ogni stadio specializzato a eseguire una certa fase; in questo modo, a regime, tutti gli stadi operano contemporaneamente su fasi diverse della stessa o di diverse istruzioni e ogni stadio elabora i dati forniti dal precedente passando i suoi risultati al successivo. Un primo esempio di pipelining si è avuto già nel processore 8086 che era dotato di una unità di ‘prefetch’ e di una omonima coda, con lo scopo di prelevare dalla memoria un certo numero di istruzioni mentre un’altra istruzione veniva decodificata e eseguita. Il meccanismo è stato poi sviluppato e potenziato fino ad arrivare alla pipeline a 31 stadi degli ultimi modelli di Pentium IV. L’adozione della pipeline comporta però anche dei problemi: • problemi strutturali: dovuti al fatto che alcune risorse del sistema di elaborazione possano dover essere condivise tra i vari stadi intralciando quindi l’esecuzione contemporanea delle varie fasi; • problemi di dipendenza dei dati: una fase successiva necessita di un dato che però ancora la fase precedente non ha prodotto; • problemi di dipendenza dal controllo: se durante l’esecuzione si incontra un salto le operazioni già eseguite nella pipeline sono inutili e la pipeline deve essere svuotata. Questi incovenienti possono portare alla necessità che alcuni stadi rimangano inattivi o meglio si pongano in esecuzione di una ‘bolla’ cioè di una operazione che non fa niente, al solo scopo di attendere di poter riprendere le operazioni valide. Il terzo tipo di problemi è il più grave, tanto che i moderni processori sono equipaggiati con un sistema di ‘predizione dei salti (branch prediction)’ grazie al quale si tenta di «indovinare» in quale direzione proseguirà l’elaborazione riempendo la pipeline di conseguenza. Nei processori più moderni, non solo viene stimato quali saranno le successive istruzioni, ma ne viene anche calcolato il risultato, aumentando il guadagno in prestazioni in caso di predizione corretta; in questo caso si parla di ‘esecuzione speculativa’. In ogni caso la spinta a utilizzare pipeline sempre più lunghe si è esaurita e nei nuovi processori Intel a doppio core la troviamo a 14 stadi; questa lunghezza è evidentemente un punto di equilibrio che permette di avere i vantaggi della tecnica del pipelining riducendo al minimo i problemi sopra illustrati. Chiudiamo questo paragrafo con la definizione di processore ‘superscalare’ che si ha quando sono presenti più pipeline che vengono gestite in parallelo grazie ad esempio alla presenza di più unità di calcolo (il primo esempio in questo senso è stata la CPU Pentium).
3.2.7 Tipo di istruzioni delle CPU: CISC e RISC In precedenza (paragrafo 1.3.3) abbiamo visto come l’esecuzione delle istruzioni può essere effettuata via hardware grazie ad opportuni circuiti, oppure (almeno in parte) tramite l’esecuzione di microprogrammi cablati nei circuiti. Grazie all’uso dei microprogrammi è però anche possibile dotare le CPU di un repertorio di istruzioni molto complesse e di lunghezza variabile che svolgano il lavoro di molte istruzioni
30
Il Personal Computer
semplici; in questo modo si hanno istruzioni lunghe da eseguire e processori molto complessi, ma il numero di istruzioni da usare per svolgere le elaborazioni è basso. Le CPU realizzate secondo questo criterio vengono dette CISC (Complex Instruction Set Computer). I vantaggi delle CPU CISC sono tutti dalla parte dei programmatori che devono scrivere programmi a basso livello e che hanno a disposizione istruzioni più potenti per tale scopo. Dal punto di vista delle prestazioni invece la situazione non è ottimale in quanto ogni istruzione complessa necessita di moltissimi cicli di clock per essere eseguita. Partendo da questa considerazione è nata l’idea dei processori RISC (Reduced Intruction Set Computer) nei quali si utilizzano istruzioni semplici, di lunghezza fissa, che non operarno direttamente in memoria ma solo co i registri, eseguite interamente via hardware e molto veloci da eseguire (anche più di una per ogni ciclo di clock). Questa idea è stata anche supportata da una ricerca cha ha dimostrato che in una CPU solo il 20% delle istruzioni compiono l’80% del lavoro; ci si è quindi concentrati a ottimizzare e rendere veloci questo 20% di istruzioni. Inoltre istruzioni molto semplici, veloci e di lunghezza fissa permettono di ottimizzare l’efficienza delle pipeline. Con i processori RISC il lavoro della CPU al momento dell’esecuzione è molto semplificato ma la complessità si sposta nella produzione del software in quanto il programmatore (a basso livello) ha a disposizione istruzioni molto meno potenti. D’altra parte solo pochi programmi vengono oggi scritti direttamente con i linguaggi di basso livello (assembly); la maggior parte viene realizzata con linguaggi di programmazione avanzati, in cui quindi la maggiore complessità della programmazione RISC ricade su quegli strumenti automatci (compilatori) che devono tradurre i programmi in forma eseguibile per il processore. Attualmente la disputa fra i sostenitori delle soluzioni RISC e CISC si è spenta e i moderni processori adottano soluzioni miste come la EPIC (Escpicitly Parallel Instruction Computing) degli Intel Itanium in cui si hanno istruzioni semplici di lunghezza fissa combinate insieme in istruzioni più lunghe in modo da poter essere eleborate contemporaneamente; in questo caso si parla anche di set di istruzioni VLIW (Very Long Instruction Word). Sisuramente però i processori Intel della famiglia x86 possono essere considerati CISC mentre gli AMD già da tempo hanno utilizzato tecnologie miste e più orientate verso i RISC. Infatti dal 2002 con i processori Duron, Athlon, Opteron, AMD ha abbondonato la corsa sfrenata all’aumento della frequenza del clock (che invece Intel ha continuato ancora per qualche anno) introducendo il ‘fattore equivalente di prestazioni’ o Performance Rating contrassegnato da un «+» vicino all’indicazione della velocità. In pratica significa che, ad esempio, l’Athlon XP 3200+ ha prestazioni equivalenti a un Pentium IV a 3,2 Ghz malgrado la sua frequenza di clock effettiva sia solo di 2,2 Ghz; questo è possibile proprio grazie alla diversa architettura interna della CPU oltre che a grazie una cache e un FSB molto veloci.
Il Personal Computer
31
3.2.8 Generazioni di processori I processori possono essere classificati, relativamente alla loro evoluzione, in generazioni; nella tabella 3.6 vengono riassunte le varie generazioni con l’indicazione, per ognuna, del processore o della categoria di processori più significativa, dell’architettura (ampiezza dei registri), della microarchitettura, della lunghezza del bus dati e indirizzi della frequenza massima del clock e dell’anno di riferimento. Per microarchitettura si intende il modo in cui vengono realizzati all’interno delle CPU le istruzioni tipiche di una architettura come la IA-32 o la Intel 64. T | abella 3.6
i386 i486 P5
Bus dati 16 16 32 32 64
Bus ind. 20 24 32 32 32
IA-32
P6
64
IA-32 IA-64 Intel 64 o x86-64
Netburst Itanium Core
Gen.
Processore
Archit.
Microarc.
Prima Seconda Terza Quarta Quinta
IA-32 IA-32 IA-32
Settima Ottava
8086 80286 80386 80486 Pentium Pentium Pro, Pentium II, Pentium III Pentium IV Itanium, Itanium-2
Nona
CPU multicore
Sesta
Clock
Anno
10 Mhz 20 Mhz 50 Mhz 100 Mhz 300 Mhz
1980 1982 1985 1989 1993
36
1 Ghz
1995
64 64
36 64
3,72 Ghz 1,66 Ghz
2000 2002
64
64
3 Ghz
2006
Occorre sottilineare come i processori Itanium segnino un netto distacco rispetto agli altri prodotti Intel con l’abbandono dell’architettura IA-32 e il passaggio alla IA-64: basti pensare che tali CPU abbandonano la gestione segmentata della memoria a favore di quella lineare; ovvia conseguenza è che le due famiglie di processori non sono compatibili. I processori Intel 64 invece sono compatibili con i predecessori (questo è anche il motivo della presenza della sigla x86-64). La tabella si riferisce a processori Intel; riguardo agli AMD possiamo citare la famiglia di processori Athlon come prodotti di maggiore spicco; in particolare la CPU Athlon 64 x2 ha portato i 64 bit e il doppio core nel mondo dei PC in anticipo rispetto ai processori di Intel.
3.2.9 Le CPU multicore Come accennato in precedenza, la corsa all’aumento della frequenza di clock delle CPU si è fermata; il massimo è stato raggiunto con i circa 3,8 Ghz degli ultimi modelli di Pentium IV. Questo è accaduto nonostante la microarchitettura alla base di questi processori, cioè la ‘NetBurst Micro Architecture’, prevedesse frequenze teoriche fino ai 10 Ghz. I motivi fondamentali di questa scelta sono i costi eccessivi di sviluppo e l’enorme aumento di consumi e di calore provocato da ogni ulteriore incremento della frequenza del clock. Arrivati alla soglia dei 4 Ghz di frequenza, infatti, un altro incremento del 10% della velocità avrebbe comportato un aumento del 15% dei consumi e un miglioramento delle prestazioni molto inferiore al 10%.
32
Il Personal Computer
Si è quindi passati da uno sviluppo «verticale» della tecnologia delle CPU ad uno «orizzontale» che consiste nell’integrare nella stessa CPU due o più core gemelli che condividono le varie risorse della CPU stessa (cache, bus, registri). Può essere interessante notare come, fino alle CPU Pentium IV l’incremento delle prestazioni veniva perseguito con tre tipi di strategie: • aumento della frequenza del clock; • aumento della quantità di cache in modo da minimizzare gli accessi alla più lenta memoria centrale; • aumento della larghezza di banda verso la memoria centrale e diminuizione della ‘latenza’ (intervallo di tempo o ritardo che intercorre tra la richiesta di un dato e il momento della sua disponibilità). Facendo un parallelo con il mondo dei motori a scoppio, vuol dire aumentare i giri del motore ottimizzando aspirazione e scarico; ma questo non è l’unico modo di incrementare la potenza: si può anche aumentare la cilindrata (cilindri più grossi) oppure il numero di cilindri, mantenendo costante il regime di rotazione. Per le CPU «l’aumento di cilindrata» è corrisposto al passaggio dall’architettura a 32 bit a quella a 64 bit con vantaggi però tutto sommato non eccezionali specialmente per macchine e applicazioni di fascia bassa (ambienti home e office) che non sfruttano appieno le maggiori possibilità di trasferimento e elaborazione di dati a 64 bit e di indirizzamento di una quantità di memoria enormemente maggiore (bus indirizzi a 64 bit anziché a 32 o 36). Invece «l’aumento del numero di cilindri» per le CPU ha significato integrare due core (e poi anche 4 o 8) nello stesso package. In questo modo si riescono ad avere prestazioni quasi doppie senza far aumentare eccessivamente i consumi e il riscaldamento del processore. Semplificando al massimo le cose possiamo supporre che se una CPU operante con un clock di 2,5 Ghz assorbe una potenza di 75 Watt, una operante con clock a 5 Ghz assorba 200 Watt; invece se si accostano due CPU del primo tipo il consumo si limita a 75 + 75 Watt, senza contare che fabbricare una CPU che operi a 2,5 Ghz è molto più semplice. I primi processori Intel della nuova microarchitettura ‘Core’, e cioè le CPU delle famiglie Core 2 Duo e Core 2 Extreme proposte dalla metà del 2006, avevano frequenze di clock di 2,66 e 2,93 Ghz rispettivamente, inferiori quindi agli ultimi modelli di Pentium 4 con una dissipazione di soli 75 Watt contro 150 Watt. Fra la Netburst e la Core, l’Intel ha proposto una microarchitettura dedicata ai PC portatili denominata ‘Mobile’ cui sono appartenute le CPU Pentium M e Core Duo specifiche proprio per i notebook; occorre precisare che la Core Duo, pur essendo ottenuta accostando due core Pentium M e pur avendo un nome somigliante ai processori di nuova generazione, non è a considerare una CPU multicore in quanto presenta la sua microrarchitettura deriva addirittura dalla vecchia P6. Le principali novità della microarchitettura Core possono essere così riassunte: • Wide Dynamic Execution: permette di aumentare il numero di istruzioni eseguite per ciclo di clock grazie alla pipeline a 14 stadi, a un meccanismo molto sofisticato di predizione delle diramazioni del flusso di esecuzione e all’aggiunta di buffer per le istruzioni che permettono di minimizzare la necessità di accessi alla cache in caso di diramazioni o salti;
Il Personal Computer
33
• Advanced Smart Cache: consente ai due core di condividere la stessa cache L2 in modo da ottimizzarne l’utilizzo quando uno dei due è inattivo e da non dovere duplicarne il contenuto se i due core operano sulle stesse istruzioni; • Smart memory Access: grazie alla tecnologia di predizione dello sviluppo delle operazioni vengono caricate nella cache L2 e L1 i dati e le istruzioni successive prima di avere completato quelle correnti; se la predizione risulta corretta si ha un notevole guadagno nei tempi di esecuzione; • Intelligent Power Capability: permette che i componenti della CPU temporaneamente inutilizzati vengano spenti per risparmiare energia, senza però comprometterne i tempi di reazione alla ripresa della loro attività; • Advanced Digital Media Boost: aumenta la velocità di esecuzione delle istruzioni multimediali SSE e prestazioni lavorando a 128 bit anziché a 64. I processori multicore rientrano nella categoria MIMD come i sistemi con più processori (multiprocessore) con la differenza però che nel primo caso i core sono nella stessa CPU e condividono le risorse, nel secondo caso si hanno diverse CPU che non condividono alcuna risorsa se non un bus di comunicazione ad esse dedicato. Si deve comunque notare, che per sfruttare appieno la presenza di core multipli, i programmi devono essere prodotti con la tecnologia SMT (Simultaneos Multithreading Technology) e i sistemi operativi devono essere ‘multi-thread’; i thread sono le parti in cui può essere suddivisa l’elaborazione di un processo (programma in esecuzione). In pratica i programmatori devono scrivere codice secondo un modello di programmazione concorrente, in caso contrario i programmi vengono eseguiti da un solo core. Le tipolgie di programmi più adatte alle CPU multicore sono quelle che riguardano la manipolazione di video e audio, la gestione di grosse basi di dati, la grafica, i servizi offerti in backgrounddai server di rete; invece un programma costantemente in primo piano che necessita di molte risorse, come un videogioco di ultima generazione, viene eseguito più velocemente da un processore tradizionale con clock molto spinto.
3.3 La memoria centrale dei PC Fisicamente la memoria RAM per i PC è costituita da ‘moduli’ cioè da circuiti stampati su cui sono i saldati e veri e propri chip di memoria (figura 3.7). F | igura 3.7.
34
Il Personal Computer
I moduli diffusi attualmente sono i DIMM (Dual Inline Memory Modules) e i SODIMM (Small Outilne DIMM) per i portatili e vanno inseriti in appositi slot sulla scheda madre (ad esempio quelli indicati con la lettera ‘G’ in figura 3.1). Tralasciando le vecchie modalità du funzionamento delle memorie RAM, come FPM (Fast Page Mode) e EDO (Extended Data Out), consideriamo le tipologie di memoria più moderne iniziando dalle SDRAM (Synchronous Dynamic RAM) che hanno costituito un punto di svolta grazie alla loro capacità di operare in sincrono cone le CPU, fornendo dati ad ogni ciclo di clock. Queste memorie vengono anche chiamate SDR (Single Data Rate) per distinguerle dalle successice DDR (Double Data Rate) che sono in grado di trasferire il doppio dei dati per ogni ciclo di clock e dalle DDR2 che trasferiscono il quadruplo dei dati. Le frequenze delle memorie SDR erano tipicamente di 66, 100, 133 Mhz; per le DDR si parte da 266 Mhz (133 effettivi), per arrivare a 600 Mhz con una banda di trasferimento dati da 2,1 a 4,8 GBps. Le DDR2 partono da 400 Mhz (100 effettivi) per salire fino a 800 e oltre con banda di trasferimento tra 3,2 e 6,4 GBps. Attualmente le memorie in commercio sono le DDR2 e le DDR3 ancora più veloci e con una ‘piedinatura’ (numero e dimensione dei contatti da inserire nello slot) diversa. Fra le varie tipologie di RAM ci sono inoltre differenze sul numero e la disposizione di incavi nella piedinatura; questo per rendere impossibile l’inserimento di moduli di memoria di tipo non adeguato negli slot della scheda madre. Riguardo alle sigle che identificano i vari moduli DIMM o SODIMM di memoria occorre prestare attenzione in quanto possiamo avere una dicitura del tipo DDR 800 accompagnata (o sostituita) da PC2 6400; nel primo caso si fa riferimento alla frequenza (non quella operativa, che si ottiene dividendo per quattro), nel secondo caso alla banda espressa in MBps. Osserviamo infine come sia possibile utilizzare una memoria con una frequenza più alta in una scheda madre predisposta per moduli di frequenza inferiore, purché della stessa tipologia (l’operazione inversa invece è sconsigliata): ad esempio è possibile usare un modulo DDR 400 al posto di un DDR 333 anche se, ovviamente, funzionerà alla frequenza inferiore.
3.4 Le periferiche Le unità periferiche si pongono come tramite tra il sistema di elaborazione e l’ambiente esterno; sono apparecchiature di varia natura controllate da ‘canali’ o ‘controller’ e da ‘interfacce’ che, come abbiamo visto, sono dispositivi dotati di capacità elaborativa e in grado di gestire l’interazione tra l’unità centrale di elaborazione e le periferiche stesse (figura 3.8). F | igura 3.8.
I controller sono sempre costituiti da componenti elettroniche mentre nelle periferiche possono essere presenti anche elementi eletromeccanici (si pensi ad esempio ad una tastiera oppure al motore di un disco fisso).
Il Personal Computer
35
Nel caso di periferiche di input la parte elettromeccanica è costituita da dispositivi detti ‘trasduttori’ che trasformano un movimento o una condizione esterna (posizione, temperatura ecc.) in un segnale elettrico digitale. Nel caso di periferiche di ouput la parte elettromeccanica è costituita da ‘attuatori’, cioè da dispositivi che trasformano un segnale elettrico digitale in un movimento o in un’altra condizione esterna. La parte elettronica è costituita da circuiti che servono ad immagazzinare temporaneamente i dati in input o output e i segnali di comando e a memorizzare le condizioni in cui è la periferica e da circuiti per attuare le operazioni proprie del dispositivo (ad esempio nella tastiera, un circuito scandisce ad intervalli regolari i contatti per verificare se c’è un tasto premuto e in caso affermativo ne individua la posizione a partire dalla quale, grazie ad una tabella , si risale al codice del simbolo corrispondente). Le periferiche sono poi dotate di un ‘data buffer’ che è un’area di memoria di transito in cui vengono «parcheggiati» i dati prima di essere inviati al dispositivo o dopo essere stati letti da quest’ultimo; la sua presenza è fondamentale per ovviare all’enorme differenza di velocità tra la CPU e il bus di sistema e le varie periferiche che impedisce trasferimenti sincroni tra tali entità e impone comunicazioni asincrone. Infatti i dati da trasferire ad una periferica vengono depositati nel buffer e vengono poi gestiti con «calma» dal controller della periferica non tenendo inutilmente occupato il bus di sistema; inoltre anche nel caso di trasferimento dalla periferica all’unità centrale il buffer è importante perché può funzionare come una piccola cache. Affinché le periferiche funzionino correttamente è poi necessario installare appositi programmi, chiamati driver, forniti insieme ai vari dispositivi o reperibili in Internet; questo a meno che il supporto per quella periferica non sia già presente nel sistema operativo utilizzato. Le periferiche si possono suddividere in due gruppi: • memorie ausiliarie o di massa: sono solitamente gestite «a blocchi», prevedono cioè trasferimenti da dati raggruppati in blocchi di un certo numero di byte; • unità di input e output: sono solitamente gestite «a caratteri», prevedono cioè trasferimenti di un carattere o byte alla volta. Prima di occuparci delle periferiche più importanti esaminiamo le modalità secondo le quali può avvenire il dialogo tra di esse e il processore ed esaminiamo poi le principali interfacce e i controller presenti in un PC per la loro gestione.
3.4.1 Comunicazione tra processore e periferiche I principali problemi della comunicazione tra processore e periferiche sono: quello della sincronia (introdotto poco sopra), quello della conversione dei dati tra la rappresentazione tipica del dispositivo esterno e il formato usato all’interno del computer e quello degli indirizzi da usare per individuare i registri dati delle varie periferiche. Della conversione di formato si devono occupare (tra le altre cose) i controller o i moduli di interfaccia delle periferiche. Per quanto riguarda la questione degli indirizzi delle periferiche, chiamati anche ‘porti’, ci sono due alternative possibili:
36
Il Personal Computer • ‘I/O mappato in memoria’ (memory mapped): in questo caso gli indirizzi fanno parte dello spazio di indirizzi assegnato alla memoria e il processore, per dialogare con la periferica, usa le stesse istruzioni predisposte per i trasferimenti da e verso la memoria centrale; questa è la soluzione adottata ad esempio dai processori Motorola; • ‘I/O isolato’ (I/O mapped): in tal caso invece gli indirizzi fanno riferimento ad uno spazio autonomo, il processore possiede istruzioni specifiche per l’input/output e deve usare segnali di controllo aggiuntivi per discriminare se gli indirizzi usati appartengono alla memoria o si riferiscono a periferiche; questa è la soluzione usata dai processori Intel e compatibili.
La comunicazione tra processore e periferiche può evvenire fondamentalmente in tre modalità: • ‘I/O programmato’; • con un meccanismo basato sulle ‘interuzioni’ o IRQ (Interrupt ReQuest); • ‘I/O autonomo’ o di tipo DMA (Direct Memory Access).
3.4.1.1 I/O programmato In questo tipo di comunicazione i trasferimenti dei dati avvengono tramite istruzioni di I/O eseguite direttamente dalla CPU; la periferica interessata al trasferimento dei dati viene individuata con un meccanismo chiamato polling/selecting. Il polling consiste in una interrogazione ciclica di tutte le periferiche collegate da parte della CPU in modo da selezionare (selecting) quella che vuole inviare o ricevere i dati in quel momento. Questa modalità di comunicazione non è utilizzata nei moderni sistemi di elaborazione perché coinvolge troppo direttamente il processore, che deve adeguarsi ai tempi di risposta molto più lenti delle periferiche, provocando uno spreco del suo tempo e quindi della sua capacità di calcolo.
3.4.1.2 Le interruzioni Per ovviare al problema appena esposto viene usato un metodo che permette alla CPU di continuare a svolgere il suo compito principale (fare calcoli) mentre le operazioni di I/O vengono gestite senza coinvolgerla direttamente; si tratta del meccanismo delle richieste di interruzione. Una richiesta di interruzione, o più brevemente, una interruzione, è un segnale che una periferica può inviare al processore per segnalare di voler iniziare un trasferimento dati o per segnalare la conclusione di un trasferimento iniziato in precedenza. In pratica, grazie alle interruzioni, la CPU non deve più preoccuparsi di interrogare le periferiche perché sono esse a «farsi avanti» al momento del bisogno con una opportuna IRQ, e non deve neanche sovrintendere al trasferimento dati, gestito invece dal controller della periferica, che ne segnala poi il completamento con un’altra IRQ. In realtà nei processori Intel e compatibili esistono due tipi di interruzioni: • interruzioni vere e proprie o ‘interruzioni hardware’ (asincrone): sono le interruzioni di cui abbiamo appena parlato;
Il Personal Computer
37
• trap o ‘interruzioni sofwtare’ (sincrone): sono richieste fatte da programma, con apposite istruzioni, per effettuare operazioni di I/O (nei linguaggi assembly delle CPU Intel l’istruzione usata è ‘INT’ seguita da un codice numerico che identifica l’interruzione software richiesta). In entrambi i casi poi si può parlare di exception (eccezioni) che sono interruzioni dovute a eventi imprevedibili: rispettivamente guasti hardware oppure errori di programma (come la divisione per zero). Fra le interruzioni solo quelle hardware, chiamate anche ‘esterne’, corrispondo ad un segnale che deve essere ricevuto fisicamente dalla CPU; le altre nascono al suo interno durante l’esecuzione dei programmi (e infatti si chiamano anche ‘interne’). Nell’architettura dei processori Intel sono stati allora predisposti dei contatti (piedini) specifici per ricevere tali segnali; nella figura 3.9 è mostrata la piedinatura della CPU 8086 in cui notiamo, tra gli altri, i contatti contrassegnati con INTR (INTerrupt Request) e NMI (Not Maskable Interrupt). F | igura 3.9.
Il primo serve a ricevere i segnali di interruzione hardware «normali», l’altro invece i segnali dovuti a guasti. Questi ultimi sono «non mascherabili»: significa che non possono essere ignorati dalla CPU; cosa che invece può avvenire per i segnali che arrivano al piedino INTR che possono essere (momentaneamente) ignorati se viene posto a uno l’apposito bit (flag IF) del registro di stato. Sempre in riferimento alla piedinatura dell’8086 segnaliamo anche il contatto INTA (INTerrupt Acknowledge) usato dalla CPU per inviare il segnale di «richiesta ricevuta» alla periferica. Per poter gestire un numero adeguato di periferiche con il meccanismo degli IRQ, nell’architettura Intel è stato previsto l’uso di un chip dedicato chiamato PIC (Programmable Interrupt Controller) o ‘integrato 8259’ con il compito di interporsi tra le periferiche e la CPU 8086. In pratica le periferiche inviano la richieste di interrupt al PIC che eventualmente le accoda in base alla loro priorità e poi invia la richiesta al piedino INTR; all’accettazione della richiesta (risposta proveniente da INTA) il PIC informa la CPU circa l’identità della periferica che ha effettuato la richiesta.
38
Il Personal Computer
Questo possibile grazie al fatto che il PIC ha otto linee (numerate da 0 a 7) a ognuna della quali è collegata una periferica in ordine crescente di priorità. Quando la CPU riceve la richiesta e la accetta (se le interruzioni non sono mascherate) termina l’esecuzione dell’istruzione pendente in quel momento e poi interrompe l’esecuzione del programma dedicandosi a gestire l’interruzione eseguendo un apposito programma di risposta chiamato ISR (Interrupt Service Routine). A questo scopo utilizza una tabella chiamata IVT (Interrupt Vector Table) valorizzata dal BIOS all’avvio della macchina, in cui sono contenuti, per ogni codice di interrupt (abbinato alla linea gestita dal PIC), gli indirizzi di memoria di partenza dei relativi ISR. Naturalmente, esaurite le operazioni previste nella risposta all’interrupt, la CPU potrà riprendere l’esecuzione del programma che aveva sospeso. Perché questo sia possibile, prima di eseguire l’ISR la CPU effettua il ‘salvataggio del contesto’ che consiste nella memorizzazione (nello stack) del valore di tutti i registri allo scopo di recuperarli quando la ISR termina. Per avere la possibilità di gestire 15 linee di IRQ invece di 8, i PIC utilizzati sono due, collegati in cascata (il secondo è collegato alla linea IRQ2 del primo); inoltre con l’architettura IA-32 sono stati introdotti integrati più sofisticati come l’APIC (Advanced PIC) e il numero degli IRQ gestibili è aumentato insieme alle potenzialità del meccanismo.
3.4.1.3 Accesso diretto alla memoria Il meccanismo delle interruzioni, pur essendo migliore rispetto all’I/O programmato, non è particolarmente indicato quando si devono trasferire blocchi di dati ad alta velocità; questa eventualità si presenta nel caso delle periferiche più veloci come i dischi fissi. Si ricorre allora ad un tipo diverso di trasferimento dati chiamato ‘I/O autonomo’ o DMA (Direct Memory Access); in questo tipo di comunicazione la CPU non viene coinvolta in quanto viene utilizzato un controller specifico chiamato DMAC (DMA Controller). Inoltre può anche essere previsto un bus dati dedicato per non «interferire» con l’uso del bus dati normale; il trasferimento avviene direttamente dal disco alla memoria centrale e viceversa in modalità ‘burst’ (a blocchi) o ‘continua’ (alternativa conveniente solo in presenza di un bus dedicato per il DMA). Nei PC i canali DMA disponibili sono otto, da DMA-0 a DMA-7, ma uno stesso canale può essere assegnato a più di una periferica, a patto siano usate solo una alla volta.
3.4.1.4 Periferiche Plug and Play Sebbene con l’avvento del bus PCI sia totalmente cambiata la modalità di identificazione delle periferiche, la gestione degli interrupt è stata mantenuta per ragioni di compatibilità. Per fortuna però, sempre con l’arrivo del PCI, è stato anche proposto uno standard denominato P N P (Plag&Play) che permette di configurare automaticamente le periferiche riguardo a: • linea IRQ; • indirizzi di I/O; • canale DMA.
Il Personal Computer
39
Precedentemente quando si installava un dispositivo questi settaggi dovevano essere fatti manualmente ed era frequente imbattersi in conflitti tra periferiche diverse. Adesso tutto questo non accade più a patto di avere chipset, BIOS, periferiche e sitema operativo, compatibili con lo standard PnP, cosa comunque sempre vera nei moderni PC. Lo standard si è successivamente evoluto nel ACPI (Advanced Configurator and Power Interface) grazie al quale vengono assegnate le linee IRQ ai dispositivi all’accensione del sistema mantenendone alcune sempre fissi, come IRQ0 per il timer e IRQ1 per la tastiera.
3.4.2 Interfacce e controller Dalla breve panoramica su interfacce e controller attualmente utilizzati in un PC escludiamo quelle che, come la porta seriale, la porta parallela, l’interfaccia a infrarossi, seppure ancora usate in qualche caso, stanno ormai per essere del tutto abbandonate.
3.4.2.1 Interfaccia ATA parallela L’interfaccia ATA (Advanced Technology Attachement) è stata per molti anni la più utilizzata per il collegamento ai dichi fissi ed è divenuta anche uno standard, chiamato ATAPI (ATA Packet Interface), esteso ai dischetti e ai dispotitivi ottici. Attualmente sarebbe più opportuno denominarla PATA (Parallel ATA) per distinguerla dalla nuova interfaccia ATA seriale di cui parleremo nel prossimo paragrafo. Spesso il termine ATA è confuso con IDE (Integrated Drive Electronics) che indica la tecnologia della parte elettronica del disco fisso; questo avviene perché, ormai da molti anni, l’elettronica dell’interfaccia è stata integrata sui dischi fissi (o sulle unità ottiche). L’interfaccia ATA consente il collegamento di due dispositivi tramite un cavo piatto a 40 o 80 poli dotato di tre connettori di cui uno dal inserire sulla scheda madre (vedi figura 3.11); i dispositivi devono essere identificati in modo diverso (master e slave) agendo su dei ponticelli (jumper) presenti nella loro parte posteriore. F | igura 3.10.
Le scelte possibili sono master, slave o cable select che vuol dire che il dispositivo diviene master o slave in base al connettore del cavo usato per il suo collegamento. Il cavo a 80 poli è da preferire per collegare dischi fissi perché assicura un trasferimento dei dati più veloce e affidable; per i lettori o masterizzatori di dischi ottici è sufficiente anche il cavo a 40 poli.
40
Il Personal Computer
Ormai da molto tempo l’IDE si è evoluto in EIDE (Enanched IDE) e parallelamente l’ATA è divenuto ATA-2. In ogni scheda madre sono disponibili due connettori EIDE che vengono identificati come controller ‘primario’ e ‘secondario’; c’è poi un altro connettore simile per il lettore di dischetti che sta comunque cadendo in disuso (questi connettori sono indicati con le lettere ‘H’ e ‘I’ nella figura 3.1). I dischi fissi e/o ottici collegabili sono quindi al massimo quattro, almeno se ci limitiamo all’uso dell’interfaccia PATA. Con essa sono possibili tre modi differenti di comunicazione: • PIO (Programmed I/O): come visto nel paragrafo 3.4.1, prevede l’intervento diretto della CPU ed è quindi poco usato venendo quasi sempre disabilitato con appositi settaggi del BIOS; • DMA (Direct Access Memory): si tratta della modalità di I/O autonomo illustrata nel paragrafo appena citato; • UDMA (Ultra DMA): è l’evoluzione del DMA e permette di ottenere velocità di trasferimento dati da 16,7 a 133 MBps; il suo utilizzo è possibile solo ricorrendo ai cavi piatti a 80 poli.
3.4.2.2 Interfaccia ATA seriale L’interfaccia di collegamento SATA (Serial ATA) sta prendendo il posto della PATA e, come si capisce dal nome, prevede un trasferimento dei dati seriale anziché parallelo. Sebbene con PATA vengano trasferiti 16 bit alla volta, la nuova interfaccia è comunque più veloce perché lavora con un clock almeno venti volte più rapido; inoltre c’è necessità di molti meno fili con una grande semplificazione della gestione dei cavi e dei connettori (si passa dai 40 o 80 fili dei cavi PATA ai 7 fili dei SATA i cui connettori sono mostrati nella figura 3.11). F | igura 3.11.
Altri miglioramenti introdotti dal nuovo standard sono la possibilità di collegamenti hot swap (si possono collegare dischi con la macchina in funzione, o «a caldo»), l’abolizione del sistema di identificazione master-slave (ogni disco ha un suo cavo) e la possibilità di avere cavi più lunghi (2 metri contro i 45 cm dei cavi PATA). Il tasso di trasferimento dell’interfaccia SATA è partito da 150 MBps per poi passare a 300 MBps con il nuovo SATA 2.0 e successivamente a 600 MBps.
Il Personal Computer
41
3.4.2.3 Interfaccia SCSI L’interfaccia SCSI (Small Computer System Interface) è abbastanza «anziana» in quanto risale al 1985 quando fu proposta per offrire prestazioni migliori rispetto ai collegamenti allora esistenti. Per poterla utilizzare è necessario disporre di una apposita scheda di controllo, da inserire ad esempio in uno slot PCI, e di dispositivi compatibili; questo fa si che l’adozione di questa tecnologia sia abbastanza costosa (l’alternativa PATA o SATA prevede invece un più economico controller integrato nella scheda madre). Le schede SCSI e i relativi dispositivi, in prevalenza dischi, sono stati allora usati soprattutto in macchine di fascia alta, come i server, dove sono importanti le prestazioni e soprattutto la robustezza e l’affidabilità; su tali tipi di macchine spesso il controller SCSI è integrato sulla scheda madre. Alla scheda SCSI, denominata anche host adapter è possibile collegare, con cavi dedicati da 50 o 68 contatti, dispositivi sia interni che esterni. Qualche anno fa una scheda SCSI era indispensabile anche nel caso si volessero usare lettori ottici (poi passati all’interfaccia PATA) e scanner (poi collegati alla porta parallela e ora alle porte USB); adesso si usa solo per pilotare dischi fissi SCSI molto prestanti e affidabili, o per gestire sistemi di dischi RAID, dei quali parleremo nel paragrafo 3.4.3.3, o anche per controllare unità a nastro magnetico. Come molte altre tecnologie, anche lo SCSI si è evoluto nel tempo: con lo SCSI-2 è stata data la possibilità di gestire periferiche diverse dai dischi, con lo SCSI-3 si è aumentata la velocità grazie anche al DT (Doble Transition) cioè al fatto che vengono fatti due trasferimenti dati per ogni ciclo di clock. Nella tabella 3.12 vengono riassunte alcune delle versioni SCSI più importanti con l’indicazione del relativo standard «ufficiale», dell’ampiezza del bus, del tipo di connettore, della frequenza del clock, del tasso di trasferimento e del numero di periferiche gestibili. A tale proposito si deve notare che a un controller SCSI si possono collegare più dispositivi eventualmente in cascata; nel conteggio va considerata anche la scheda di controllo stessa, quindi i dispositivi gestibili realmente sono quelli teorici meno uno. Ognuno di essi deve essere identificato con un indirizzo univoco detto LUN (Logical Unit Number) che va da zero a sette o a quindici; per questo occorre agire su dei ponticelli presenti in ogni periferica tenendo presente che gli indirizzi più alti hanno maggiore priorità e che il più alto è solitamente riservato al controller. Con le versioni SCSI più recenti l’indirizzamento avviene comunque in modo automatico. T | abella 3.12 Versione SCSI-1 Wide SCSI Fast SCSI Fast Wide SCSI Ultra SCSI Wide Ultra SCSI Ultra2 SCSI Wide Ultra2 SCSI Ultra160 SCSI Ultra 320 SCSI
Standard SCSI-1 SCSI-2 SCSI-2 SCSI-2 SCSI-3 SCSI-3 SCSI-3 SCSI-3 SCSI-3 SCSI-3
Bus 8 bit 16 bit 8 bit 16 bit 8 bit 16 bit 8 bit 16 bit 16 bit 16 bit
Conn. 50 fili 68 fili 50 fili 68 fili 50 fili 68 fili 50 fili 68 fili 68 fili 68 fili
Clock bus 5 Mhz 5 Mhz 10 Mhz 10 Mhz 20 Mhz 20 Mhz 40 Mhz 40 Mhz 40 Mhz DT 80 Mhz DT
Tasso trasf. 5 MBps 10 MBps 10 MBps 20 MBps 20 MBps 40 MBps 40 MBps 80 MBps 160 MBps 320 MBps
Perif. 8 16 8 16 8 16 8 16 16 16
42
Il Personal Computer
3.4.2.4 Interfacce USB e FireWire Con il termine USB (Universal Serial Bus) si intende un’interfaccia di nuova concezione (la proposta nasce nel 1995) pensata per il collegamento di periferiche esterne in sostituzione delle vecchie porte seriale e parallela, allo scopo di migliorarne sia le prestazioni che la comodità d’uso. Per soddisfare la seconda richiesta sono stati proposti connettori e cavi standard che possono arrivare a 5 metri di lunghezza. Nella figura 3.13 si vedono da sinistra a destra: • connettore di tipo B mini; • connettore di tipo; • femmina di tipo A di un cavo di prolunga; • connettore di tipo A. F | igura 3.13.
Nella figura 3.14 si vedono invece due porte USB (tipo A femmina) di un PC portatile. F | igura 3.14.
Il bus USB necessita di un controller, denominato anche host USB che incorpora un hub (fulcro, concentratore) USB, chiamato hub-root, dotato generalmente di due porte. Ogni moderna scheda madre ha integrati almeno uno o due di tali controller e dovrebbe mettere a disposizione anche una piedinatura USB per dispositivi interni. Ad un bus USB possono essere collegate fino a 127 periferiche con una organizzazione piramidale chiamata tiered stars (stelle collegate) ottenuta grazie all’uso di hub come quello di figura 3.15, in cui vediamo anche un piccolo cavo di prolunga USB.
Il Personal Computer
43
F | igura 3.15.
L’organizazzione piramidale prevede un massimo di sette «piani» con il controller «logicamente» collocato in cima; scendendo di livello possiamo avere hub e periferiche singole, fino ad arrivare al settimo piano in cui possono esserci solo queste ultime; lo scopo degli hub è quello di aumentare la disponibiltà di porte USB utilizzabili. Il tutto può essere esemplificato nello schema della figura 3.16 che comunque rappresenta una situazione molto più complessa e articolata di quelle che si incontrano di solito nei casi concreti. F | igura 3.16.
Il controller ovviamente ha il compito di gestire il bus e lo fa in maniera deterministica con un meccanismo di polling/selecting di cui si è accennato nel paragrafo 3.4.1. Questa è una differenza rispetto ad altri bus, come ad esempio lo SCSI, che vengono gestiti con una politica «a contesa»; il motivo va ricercato nel fatto che molti dispositivi per cui è stato pensato USB sono multimediali e pretendono che i dati siano trasferiti ad intervalli di tempo certi e regolari pena lo scadimento della qualità delle applicazioni audio o video che usano tali dispositivi. Infatti, a differenza di quello che avviene nel polling/selecting, nel meccanismo a contesa è il dispositivo che «prende l’iniziativa» e usa il bus quando ne ha bisogno, a patto che sia libero; in caso contrario rimane in uno stato di attesa che ha durata imprecisata (quindi si tratta di una politica di gestione non deterministica dei trasferimenti tra PC e periferiche). Ogni periferica riceve automaticamente dal controller un indirizzo che serve ad identificarla per le operazioni di trasferimento dei dati; a tale scopo viene usato un protocollo a ‘pacchetti’:
44
Il Personal Computer • token packet: viene inviato dal controller e contiene l’indirizzo del dispositivo coinvolto nella comunicazione e informazioni su natura e direzione dello scambio dati da effettuare; • data packet: contiene i dati veri e propri che il sorgente invia alla destinazione (sorgente e destinazione sono l’host USB e una periferica o viceversa a seconda della direzione del trasferimento); • hanshake packet: contiene il messaggio sull’esito positivo o negativo della trasmissione che la destinazione invia al sorgente.
Esaminando brevemente le caratteristiche elettriche del bus notiamo che il cavo comprende solo quattro fili di cui uno per la «terra» e uno per l’alimentazione elettrica (5 V) e due per la trasmissione dei dati, che avviene in modo bilanciato e i half-duplex. Questo significa che i dati circolano in entrambi i sensi ma alternativamente; le altre possibilità sarebbero: simplex (trasmssione possibile solo in un verso) e full-duplex (trasmissione contemporanea in entrambi i sensi). I due fili per i dati denominati ‘D+’ e ‘D-’ sono incrociati per minimizzare i disturbi; inoltre, siccome i bit vengono rappresentati da variazioni di tensione (da 0 V a +3 V e -3 V rispettivamente) contemporaneamente sui due conduttori, un eventuale rumore elettrico avrebbe effetto su entrambi, non alterando la tensione relativa fra loro e non influendo quindi sull’integrità del dato trasmesso. Il controller ed ogni dispositivo hanno un proprio clock autonomo e c’è quindi l’esigenza di sincronizzazione tra sorgente e destinazione durante la comunicazione; allo scopo vengono inviati dei caratteri speciali (syn). Il fatto che il cavo trasporti anche l’alimentazione è importante perché permette appunto di alimentare direttamente i dispositivi dalla porta USB; si parla in questo caso di bus powered device. Le periferiche per cui questo è possibile sono però solo quelle che non hanno grosse esigenze di potenza in quanto la corrente disponibile è di sole 500 mA, eventualmente da suddividere tra i dispositivi che fossero collegati ad un hub. Per questo motivo quasi sempre gli hub prevedono la possibilità di una alimentazione supplementare (come si nota anche in quello mostrato nella figura 3.15); in ogni caso quando la corrente disponibile via USB non è sufficiente, la periferica deve essere collegata direttamente ad una fonte di alimentazione elettrica e in questo caso si parla di self powered device. Altra caratteristica importante del bus USB è il fatto che permette i collegamenti a caldo dei dispositivi. Per quanto riguarda il tasso di trasferimento dei dati occorre distinguere tra i due standard USB più diffusi: • ‘USB 1.1’: velocità di trasferimento di 12 Mbps (Mega bit per secondo); • ‘USB 2.0 Low speed’: velocità di trasferimento di 1,5 Mbps; • ‘USB 2.0 Full speed’: velocità di trasferimento di 12 Mbps; • ‘USB 2.0 High speed’: velocità di trasferimento di 480 Mbps. Notiamo quindi che anche l’obiettivo di migliorare le prestazioni delle vecchie interfacce seriale (115,2 Kbps) e parallela (2,4 MBps) è pienamente raggiunto ed è fattibile il collegamento alle porte USB anche di periferiche veloci come gli hard disk o i lettori e masterizzatori di DVD
Il Personal Computer
45
esterni; inoltre con il nuovo standard USB 3.0 in preparazione, si avrà una velocità di 4,8 Gbps e verrà mantenuta la retrocompatibilità con le versioni precedenti. Concludiamo questo paragrafo citando il bus ‘FireWire’ noto anche come standard IEEE-1394 e successivamente IEEE-1394b. L’IEEE (Institute of Electrical and Electronic Engineer) è un’organizzazione scientifica internazionale con sede negli Stati Uniti che, fra le sue attività, ha anche quella di definire standard nei campi dell’elettronica e dell’informatica. Anche nel caso del FireWire siamo in presenza di un bus seriale capace di raggiungere la velocità di 400 Mbps e 800 Mbps nella versione più recente; altre analogie con USB sono la lunghezza massima del cavo, sempre di cinque metri circa e la possibilità di fare collegamenti a caldo. Ci sono però anche molte differenze: • i connettori, i cavi e le porte sono diversi e non compatibili; • non è obbligatoria la presenza di un host controller e quindi si può collegare direttamente un dispositivo FireWire ad un altro senza la presenza di un PC; • non esistono hub FireWire, ma si possono comunque collegare dispositivi in cascata; • le possibilità di alimentare i dispositivi sono maggiori e nella versione IEEE-1394b si ha una potenza disponibile di 25 Watt sufficienti, ad esempio, per un masterizzatore di DVD esterno. Il bus FireWire non è comunque fortemente diffuso nel mondo dei PC (con l’eccezione dei notebook) mentre è molto utilizzato nel campo dei dispositivi multimediali e soprattutto delle videocamere digitali. Come abbiamo notato la comunicazione tra le periferiche e il PC sta divenendo tutta di tipo seriale: infatti il bus SATA sta sostituendo PATA, le porte USB stanno soppiantando le porte parallele, oltre alle vecchie seriali. I motivi di questo passaggio sono fondamentalmente i seguenti: • è richiesto un minor numero di fili con conseguente riduzione dei costi; • c’è minore rischio di interferenze e di errori di trasmissione. Ovviamente però, il fatto che il circuito trasmissivo sia più semplice, comporta una gestione più complessa da parte dei controller e del relativo software.
3.4.3 Memorie ausiliarie o di massa Abbiamo visto come la memoria centrale del sistema di elaborazione abbia la funzione di immagazzinare dati ed istruzioni durante la fase di elaborazione di un programma. Le memorie ausiliarie invece servono per la conservazione delle informazioni nel tempo e quindi sono non volatili; vengono chiamate anche memorie di massa (in inglese mass storage) perché possono contenere una grande mole di dati ed informazioni. In base al ‘tipo di accesso’ si suddividono in due grandi categorie:
46
Il Personal Computer • ad ‘accesso sequenziale’ come i nastri magnetici o i dischi ottici; • ad ‘accesso diretto’, come i dischi magnetici.
Le memorie di massa si possono poi anche classificare secondo la ‘tecnologia’ con la quale vengono realizzate e allora si parla di: • memorie ‘magnetiche’come i nastri, i dischetti, i dischi fissi; • memorie ‘ottiche’ come i CD-ROM e i DVD-ROM. Le memorie magnetiche si basano sulla caratteristica dei campi magnetici di essere ‘statici e semipermanenti’: possono cioè cambiare configurazione e, una volta variata, la mantengono finché qualcosa non provoca un ulteriore cambiamento (questo fa sì che esse siano riscrivibili e non volatili). Esse vengono realizzate usando sostanze magnetizzabili, come l’ossido di ferro, disposte su supporti metallici o plastici; la superficie magnetizzabile viene suddivisa in piccolissime porzioni dette ‘areole’ ognuna delle quali destinata a contenere un bit. La testina di lettura/scrittura non tocca la superfice, si limita a sfiorarla alla minima distanza possibile (per permettere maggiore densità di memorizzazione dei dati); in fase di scrittura viene fatta circolare una corrente nella testina in modo da magnetizzare le areole, in fase di lettura il campo magnetico delle areole genera piccole correnti orientate nella testina. Ogni areola può essere magnetizzata in senso orario oppure antiorario; quando la testina in lettura riscontrata una transazione di flusso, cioè un cambiamento da un orientamento all’altro, si associa il valore 1, in mancanza di tale transazione si associa il valore 0. Questo modo di rappresentare i bit viene detto ‘indiretto’ e viene preferito, perché più affidabile, a quello ‘diretto’, che sembrerebbe più semplice e intuitivo: magnetizzazione in un senso corrisponde al valore 0, nell’altro senso al valore 1. Le memorie ottiche invece sfruttano la tecnologia laser per rappresentare i bit che vengono letteralmente «scolpiti» sulla superficie riflettente del supporto di memoria; in questo modo si hanno depressioni (pit) e tratti di superficie liscia (land). La rilevazione dei dati memorizzati avviene grazie a un diodo che invia verso la superficie un fascio laser che viene riflesso verso il dispositivo di lettura nel caso colpisca un land e disperso nel caso colpisca un pit. Anche in questo caso l’informazione viene rappresentata in modo ‘indiretto’: la transazione da pit a land o viceversa corrispone al valore 1, la mancata transazione al valore 0. La tecnologia ottica ha il pregio di offrire una densità di registrazione superiore rispetto a quella magnetica e anche di essere molto più resistente nel tempo (un disco ottico non può «smagnetizzarsi»), ma ha anche il difetto di non permettere la variazione delle informazioni registrate, in quanto il meccanismo di memorizzazione ora illustrato altera in maniera permanente le caratteristiche del supporto di memoria (ciò avviene ad esempio per i CD-ROM e i DVD-ROM). Il problema è stato superato nelle memorie ottiche scrivibili (ad esempio i CD-R) e riscrivibili (ad esempio i CD-RW) nelle quali i pit non sono più delle incisioni sulla superfice del disco ma delle alterazioni, ottenute tramite surriscaldamento, della struttura cristallina di un polimero che ricopre la superfice stessa (tale alterazione è reversibile nei supporti riscrivibili); le zone alterate riflettono in modo diverso il raggio inviato del dispositivo di lettura permettendo di avere lo stesso effetto dei pit «scolpiti». Per un supporto riscrivibile il raggio laser inviato dalla testina di lettura/scrittura ha tre potenze possibili:
Il Personal Computer
47
• alta potenza: porta allo stato amorfo non riflettente (corrisponde alla creazione di un pit); • media potenza: porta allo stato cristallino riflettente (corrisponde alla creazione di un land); • bassa potenza: usata per la lettura.
3.4.3.1 Nastro magnetico Un nastro magnetico è una striscia di materiale plastico ricoperta di ossido di ferro in esso ogni carattere viene rappresentato con 8 bit (più un bit per il controllo di parità) disposti sulla superficie del nastro stesso su 9 «piste» parallele (figura 3.17). F | igura 3.17.
Il dispositivo di gestione del nastro, cioè l’unità a nastri collegata al sistema di elaborazione, è dotata di una testina di lettura e scrittura in grado di leggere e modificare contemporaneamente i valori dei 9 bit corrispondenti ad un carattere, sulle 9 piste del nastro. Il bit di parità serve per un controllo su possibili errori di lettura: il suo valore è 0 o 1 in modo da rendere sempre pari il numero di bit «1» del carattere rappresentato; in caso si presenza di un numero dispari di «1» nella codifica di un carattere, il sistema rileverebbe una situazione di errore. Questo tipo di controllo è il più semplice fra tutti quelli che vengono frequentemente effettuati sui dati memorizzati o trasmessi, ma è anche il meno efficace in quanto se si verificano due errori sullo stesso carattere il numero di «1» rimane pari e quindi non viene individuata alcuna anomalia. I caratteri sul nastro vengono memorizzati uno a fianco all’altro, senza però occupare tutta la lunghezza magnetizzabile del supporto; sono invece suddivisi in blocchi separati da zone vuote chiamate gap. Il ruolo dei gap è importante perché il nastro viene fatto scorrere solo quando il sistema effettua letture o scritture (altrimenti è fermo) e tali operazioni possono avvenire solo quando la velocità di scorrimento del nastro è costante; il gap serve allora serve a fare in modo che il nastro raggiunga tale velocità prima della effettuazione dell’operazione richiesta. Quella descritta è la logica «classica» di funzionamento dei nastri chiamata anche ‘start-stop’; nel tempo poi le tecniche di memorizzazione si sono evolute e possiamo citare, senza ulteriori approfondimenti di nastri streaming (sempre in movimento), registrazione in parallelo, registrazione elicoidale, registrazione a serpentina o lineare. I nastri magnetici sono stati i primi supporti di memoria di massa nella storia dell’informatica, sono economici e possono contenere una grossa quantità di dati, ma il fatto che consentono un accesso solo sequenziale ne limita molto l’uso in tutte le applicazioni che richiedono una grande velocità di reperimento delle informazioni o loro frequenti aggiornamenti.
48
Il Personal Computer
Per questo i nastri vengono oggi principalmente utilizzati per fare le copie di sicurezza di archivi residenti su altri tipi di memorie (come i dischi). Ormai da molti anni non esistono più i vecchi nastri magnetici a bobina (simili a quelli dei registratori audio degli anni ’60) e sono stati sostituiti dai nastri a cartuccia (somiglianti alle musicassette) molto più comodi da usare e meno ingombranti. Fra i più diffusi possiamo citare i sistemi DLT (Digital Linear Tape) e SuperDLT, pilotati da interfaccia SCSI e con capacità di diverse centinaia di GB. Molti produttori hanno anche proposto dei sistemi in grado di gestire più cartucce contemporaneamente e metterle in linea o fuori linea automaticamente minimizzando il bisogno di interventi manuali; si tratta dei cosiddetti jukebox il cui funzionemnto ricorda proprio quello dei vecchi jukebox musicali.
3.4.3.2 Disco fisso e dischetto Fra i dischi magnetici si possono distinguere i dischi singoli come il floppy disk, o dischetto, e i disk-pack come il disco fisso. Nel primo caso si ha un disco di materiale plastico, con diametro di 3,5 pollici, inserito, per proteggerlo, in un involucro di plastica più robusta, dotato di feritoia apribile per permettere l’accesso alle testine di lettura e scrittura (figura 3.18); entrambe le superfici vengono usate per memorizzare i dati. F | igura 3.18.
I dischetti hanno il vantaggio di essere comodamente trasportabili, però la loro lentezza e la capacità (1,44 MB) ormai irrisoria fanno si che non vengano praticamente più usati, a vantaggio delle penne USB, ugualmente trasportabili ma molto più veloci e capienti; di conseguenza, nei moderni PC, specialmente se portatili, stanno scomparendo i lettori di floppy. Nel disco fisso si hanno più «piatti» di alluminio o di altro materiale rigido (da cui discende l’altro nome spesso usato di «disco rigido» o hard disk) montati su un singolo asse e racchiusi in un involucro che comprende anche: le componenti elettroniche, il motore elettrico per la rotazione dei dischi e un braccio mobile, chiamato «pettine», dotato di tante testine di lettura e scrittura quante sono le facce utilizzabili per la memorizzazione. Nella figura 3.19 vediamo un disco aperto con i piatti e una delle testine in vista; nella figura 3.20 è mostrata invece la parte posteriore con i chip di controllo.
Il Personal Computer
49
F | igura 3.19.
F | igura 3.20.
Il disco fisso è collegato alla scheda madre con le interfacce (PATA, SATA, SCSI) citate in precedenza. Il diametro dei piatti è quasi sempre di 3,5 pollici eccetto per i dischi fissi dei portatili per i quali si hanno unità da 2,5 pollici. Sia nel dischetto che nel disco fisso le superfici sono ricoperte di materiale magnetizzabile e lo spazio è organizzato in cerchi concentrici chiamati ‘tracce’ suddivise in «spicchi» chiamati ‘settori’. Nel caso del disco fisso si parla anche di ‘cilindri’ che corrispondono agli insiemi di tutte le tracce che, sulle varie superfici dei piatti, sono alla stessa distanza dal centro (figura 3.21). F | igura 3.21.
50
Il Personal Computer
In ogni traccia i bit dei dati sono memorizzati in sequenza su areole consecutive. Il disco fisso rimane in rotazione per tutto il tempo in cui il sistema è acceso; questa è una differenza rispetto al floppy disk e alle unità ottiche che vengono poste in rotazione solo al momento dell’accesso. La velocità di rotazione è molto importante perché influisce sulle prestazioni del disco: attualmente si hanno regimi di rotazione a 7.200 o 10.000 giri/minuto anche se alcuni dischi SCSI possono arrivare a 15.000 Le testine vengono spostate in senso radiale e rimangono sempre ad una distanza molto piccola dalle superifci, senza toccarle, in quanto sono sollevate da un sottile strato di aria originato dalla rotazione; quando il sistema è spento vengono «parcheggiate» in una posizione prestabilita chiamata landing zone. L’accesso ai dati è di tipo diretto e avviene in base al loro indirizzo costituito da: numero di superfice o ‘testina’, numero di traccia o ‘cilindro’, numero di ‘settore’. L’insieme di queste informazioni prende il nome di ‘geometria del disco’; essa viene definita con l’operazione di ‘formattazione a basso livello’, svolta in fabbrica e utile anche a marcare, come non utilizzabili, i settori difettosi. Ogni settore ha una grandezza di 512 byte: moltiplicando per tale valore il numero di testine, cilindri e settori, si ottiene la capienza del disco fisso. Attualmente sono in commercio modelli di dischi con capacità di alcune centinaia di GB; a tale proposito occorre però notare che la capacità dei dischi viene espressa, dalle aziende prodruttrici, con mutipli del byte ottenuti con potenze del dieci e non del due; quindi quando acquistiamo un disco da 250 GB ci dobbiamo aspettare che contenga 250.000.000.0000 byte e non 268.435.456.000 byte (250 * 1.024 * 1.024 * 1.024). Lo spazio disponibile su un disco fisso può essere suddiviso in partizioni, dopodiché ogni partizione deve essere preparata all’uso con l’operazione di ‘formattazione ad alto livello’ grazie alla quale viene definito su di essa il ‘file system’ da utilizzare (ad esempio FAT32 o NTFS per Windows e Ext3 per Linux). Una partizione può contenere solo dei dati oppure un sistema operativo; in questo caso all’inizio del suo spazio è memorizzato un programma di boot per quel sistema e la partizione si dice bootable. Nel caso la suddivisione non venga fatta, esiste comunque una (unica) partizione, quindi la formattazione ad alto livello viene sempre fatta su partizioni e non su tutto il disco (a meno che non sia un dischetto per il quale le partizioni non sono previste). I motivi per cui può essere utile usare più partizioni sono: • suddividere l’enorme spazio disponibile nei moderni hard disk;
Il Personal Computer
51
• installare più sistemi operativi, da usare alternativamente, sulla stessa macchina; ognuno di essi deve risiedere su una o più partizioni separate; • avere una partizione, che solitamente viene tenuta nascosta, in cui memorizzare l’occorrente per il ripristino della macchina alle sue condizioni iniziali in caso di problemi; questo meccanismo viene messo in atto dai alcuni produttori sui PC da essi commercializzati ma può anche essere gestito autonomamente dagli utenti ricorrendo ad appositi programmi. Le informazioni sulle partizioni sono conservate nel primo settore del disco, identificato da: testina 0, cilindro 0, settore 1 (la numerazione dei settori inizia da uno e non da zero) e precisamente nel MBR (Master Boot Sector). L’MBR contiene la parte iniziale del ‘boot loader’ o ‘boot manager’ (programmi che gestiscono le prime fasi del caricamento del sistema operativo all’eccensione della macchina) e una tabella chiamata ‘tabella delle partizioni’. Essa è costituita da 4 righe, di 16 byte ciascuna, che descrivono ognuna una eventuale partizione; le partizioni possono essere quindi al massimo quattro. Questo limite non era problematico all’epoca dei primi dischi fissi per i PC (metà anni ’80) che avevano capacità di qualche MB e per i quali non aveva molto senso prevedere un grosso numero di partizioni. Successivamente è divenuto sempre più importante riuscire a definire più di quattro partizioni su un hard disk e si è quindi intervenuti nel modo seguente: una delle quattro partizioni «normali» chiamate ‘primarie’ può essere definita come partizione ‘estesa’ e contenere al suo interno un numero illimitato di partizioni ‘logiche’. Non forniamo qui ulteriori dettagli su come questo meccanismo venga gestito; segnaliamo solo che i sistemi operativi Windows sono in grado di attivarsi correttamente solo se installati su partizioni primarie.
3.4.3.3 Dischi RAID I sistemi di dischi RAID (Redundant Array of Indipendent Disks) nascono negli anni ’80 allo scopo di risparmiare riutilizzando dischi a basso costo gestendoli come una unica unità di memoria di massa; all’epoca infatti la «I» dell’acronimo stava per «Inexpensive» (poco costosi). Adesso l’accento non è più posto sul risparmio (un moderno sistema RAID è anzi abbastanza costoso) ma sul miglioramento delle prestazioni, sull’integrità dei dati, la tolleranza ai guasti. La gestione può essere fatta via hardware (solitamente con controller SCSI) o via software a carico del sistema operativo; ovviamente la prima soluzione è da preferire, anche se più costosa, perché permette di avere prestazioni migliori e funzionalità aggiuntive come la possibilità di sostituire a caldo i dischi. Parlando di tecnlogia RAID occorre distinguere varie tipologie o livelli che si possono suddividere in livelli ‘RAID standard’ e livelli ‘RAID annidati’ (uso contemporaneo di livelli standard). Per quanto riguarda i livelli standard, i più importanti e usati sono: • RAID 0 o ‘striping’; • RAID 1 o ‘mirroring’; • RAID 5 o ‘striping con parità’;
52
Il Personal Computer • RAID 6 o ‘striping con doppia parità’.
Nello striping si ha l’uso di più dischi che vengono virtualmente uniti per formare un disco grande quanto la somma dei dischi componenti; i dati vengono suddivisi a strisce (stripes) e ogni striscia è memorizzata in un disco diverso (figura 3.22). F | igura 3.22.
In questo modo si ottimizza la velocità di accesso perché le letture o le scritture vengono fatte in contemporanea su più dischi. L’affidabilità invece non aumenta e addirittura diminuisce in quanto, usando più dischi, aumenta la probabilità che uno di essi si guasti, causando la perdita di tutti i dati; in altre parole, il parametro MTBF (Mean Time Between Failures), cioè il tempo medio tra due guasti, che dovrebbe essere il più alto possibile, diminuisce aumentando il numero di dischi impiegati. Nel mirroring (figura 3.23) si usano un numero pari di dischi in modo da avere una doppia copia degli stessi dati; in questo caso si privilegia ovviamente l’affidabilità e, in piccola parte, la velocità almeno in lettura (i dati possono essere letti da più dischi contemporaneamente). F | igura 3.23.
Ulteriore incremento di affidabilità si ha con il ‘duplexing’ nel quale viene duplicato anche il controller SCSI. Il problema è lo spreco di spazio in quanto con il mirroring si ha a effettivamente a disposizione solo la metà della capacità totale disponibile. Con il RAID 5, che è uno dei sistemi più usati, i dati vengono memorizzati come nel RAID 0 ma in più vengono calcolati e immagazzinati, sempre su dischi diversi, anche dei dati di parità (figura 3.24); grazie ad essi è possibile sopperire all’improvvisa mancanza per guasto di uno dei dischi.
Il Personal Computer
53
F | igura 3.24.
I dati mancanti infatti vengono ricalcolati automaticamente, a prezzo, ovviamente, di un certo rallentamento nel funzionamento del sistema. Siccome poi è possibile la sostituzione a caldo dei dischi, il disco rotto può essere cambiato con uno nuovo e, dopo poco tempo, il sistema torna a pieno regime nella situazione precedente al guasto. Se i dischi che si guastano sono invece due, il RAID 5 non è più efficace; per questo motivo non è bene usare più di 14 dischi perché oltre questo valore aumenta troppo la probabilità di guasto contemporaneo di due dischi. Il numero minimo di dischi da usare è invece di tre e i dischi devono essere identici. Il RAID 6 funziona come il RAID 5 ma ha un meccanismo di doppia parità che permette di sopportare anche il guasto contemporaneo di due dischi. I livelli RAID annidati più usati sono: • RAID 0+1: uso del RAID 0 su n dischi e copia in RAID 1 su altri n dischi (figura 3.25); • RAID 1+0: uso di dischi copiati in RAID 1 e poi uniti in RAID 0 (figura 3.26). F | igura 3.25.
54
Il Personal Computer F | igura 3.26.
3.4.3.4 Unità ottiche La prima memoria di tipo ottico ad avere una grossa diffusione è stata il CD-ROM (Compact Disc - Read Only Memory) diretto discendente dei CD-DA (CD Digital Audio) proposti dalla Sony e dalla Philips nel 1982 allo scopo di sostituire i dischi in vinile come supporto per la diffusione e la commercializzazione della musica. Il supporto è costituito da un disco trasportabile di 12 cm di diametro di materiale plastico rivestito di oro o alluminio riflettente e da uno strato protettivo (figura 3.27); queste caratteristiche sono rimaste costanti in tutte le successive evoluzioni delle memorie ottiche (CD-R, CD-RW, DVD ecc.). F | igura 3.27.
I dati vengono registrati usando pit e land, come illustrato nel paragrafo 3.16, sfruttando solo una delle superfici (solitamente quella inferiore, libera da etichette, scritte ecc.). La memorizzazione avviene su una traccia suddivisa in settori e avvolta a spirale; tale spirale inizia al centro del disco e arriva al bordo dopo un percorso di quasi cinque km. La masterizzazione dei CD-DA e dei CD-ROM avviene in fabbrica: nel primo caso, viene memorizzata sul supporto musica digitalizzata, nel secondo caso, dati e informazioni gestibili da un computer. Un CD-ROM può quindi essere solo letto usando un’apposita unità collegata alla scheda madre; per poter avere supporti anche scrivibili e riscrivibili sono stati proposti rispettivamente i CD-R (CD Recordable) e i CD-RW (CD ReWritable).
Il Personal Computer
55
La tecnologia che ha reso possibile la masterizzazione «casalinga» di questi supporti è stata brevemente accennata nel paragrafo 3.16; naturalmente per essere in grado di effetturla non basta più avere un lettore di CD ma serve un masterizzatore (che conserva comunque la capacità di leggere CD-ROM, CD-R, CD-RW). La capacità; di questo tipo di supporti è stata in partenza di 650 MB o 74 minuti di musica, ma è poi passata, sfruttando in modo migliore lo spazio vicino al bordo del disco, a 700 MB o 80 minuti. In commercio si trovano anche dischi che superano questi limiti ma la loro affidabilità non è garantita, anche perché non è detto possano essere scritti e riletti regolarmente dalla maggior parte dei masterizzatori in circolazione. Un passo avanti importante nel campo dei supporti ottici si è avuto con l’avvento dei DVD (Digital Video Disk o Digital Versatile Disk), motivato anche stavolta da ragioni «multimediali», in questo caso dal mondo del cinema; il DVD infatti è stato proposto per poter contenere un film digitalizzato della lunghezza di 133 minuti compresso con l’algoritmo MPEG-2, con audio stereo e sottotitoli in più lingue. Il formato fisico del disco è lo stesso del CD-ROM ma aumenta molto la densità di memorizzazione; i bracci della spirale distano 0,74 micron contro 1,6 dei CD e si arriva a poter contenere 4,7 GB di dati. Anche per i DVD si è avuta una evoluzione simile a quella dei CD e quindi dopo i DVD-ROM sono comparsi: • DVD-R e DVD+R: DVD scrivibile una sola volta; • DVD-RW e DVD+RW: DVD riscrivibili, fino a circa 1.000 volte. La tecnologia dei DVD+R e DVD+RW è leggermente diversa da quella dei CD-R, CD-RW, DVD-R, DVD-RW in quanto prevede che le zone colpite dal raggio di scrittura diventino momentaneamente liquide per poi solidificare subito dopo con una stutture diversa, anziché basarsi su alterazioni della struttura cristallina come accennato nel paragrafo 3.4.3; questa differenza non porta conseguenze a livello pratico anche perché tutti i lettori e masterizzatori prevedono la gestione di entrambe le categorie di supporti. Per aumentare ulteriormente la capacità dei DVD sono stati proposti: • dischi a doppia faccia: portano la capienza a 9,4 GB ma necessitano di essere girati manualmente al momento del bisogno perché nei lettori il meccanismo di lettura è uno solo; • dischi a doppio strato: sfruttando una diversa inclinazione del raggio laser di masterizzazione e di quello di lettura, vengono resi disponibili due strati diversi sulla stessa superfice; in questo modo la capienza arriva a 8,5 GB; • dischi a doppio strato e doppia faccia: vale quanto detto per quelli a doppia faccia; la capacità è di 17 GB. Un moderno lettore di DVD dovrebbe essere in grado di leggere, e un moderno masterizzatore di DVD di scrivere e leggere, tutte le tipologie di CD e di DVD con l’eccezione dei DVD-RAM. Essi infatti sono dischi, riscrivibili fino a 100.000 volte, proposti da Panasonic che si sono diffusi soprattutto come supporto per le videocamere digitali e che prevedono la possibilità di essere usati in modo simile agli hard disk (tra l’altro in essi non c’è la traccia avvolta a spirale); difficilmente un lettore o masterizzatore di «normali» DVD è in grado di gestire questi supporti.
56
Il Personal Computer
L’accesso ai dischi ottici è sequenziale come per i nastri magnetici, anche se la tecnologia usata lo rende più veloce rispetto a questi ultimi; riguardo alla velocità si fa spesso riferimento a dei fattori di moltiplicazione, relativi alle prestazioni in lettura, scrittura e riscrittura, che si basano su un valore assunto come base di partenza. Per i CD tale velocità di base (1X) è di 150 KBps, corrispondente alla velocità dei lettori dei CD-Audio, per i DVD invece il parametro 1X corrisponde a 1350 KBps; quindi un lettore di CD 52X e un lettore di DVD 16X (valori consueti per i moderni dispositivi), leggono rispettivamente alle velocità di 7.800 e 21.600 KBps. Il file system standard per i CD e i DVD è l’‘ISO 9660’ che è supportato da tutti gli attuali sistemi operativi. ISO (International Standard Organization) è l’organizzazione che definisce vari standard a livello mondiale. Con l’ISO 9660 ci sono delle limitazioni per quanto riguarda i supporti riscrivibili perché non è supportata la modifica dei dati; si può però usare la scrittura di sessioni multiple che consiste nel masterizzare dati aggiungendoli ai precedenti. In questo modo però si sprecano circa 40 MB di spazio per ogni sessione aggiunta. Una soluzione migliore è il file system UDF (Universal Disk Format) che permette di trattare il supporto riscrivibile come se fosse un dischetto magnetico con libertà di aggiunta e cancellazione di file; questa soluzione (packet writing) però non è standard e alcuni sistemi operativi non la supportano obbligando l’utente a ricorrere a programmi aggiuntivi per la sua gestione. Per il futuro, la nuova tecnologia ottica è il Blu-Ray della Sony, con la quale i dischi arrivano a capacità di 27 GB per lato; il nome è dovuto al fatto che il raggio luminoso usato per la lettura è di colore blu, anziché il consueto rosso. L’aumento di capacità è dovuto principalmente all’assottigliarsi dello strato trasparente protettivo sulla superfice del disco che passa da 0,6 mm a 0,1 mm; in questo modo il laser deve attraversare meno materiale prima di raggiungere il substrato di memorizzazione e quindi il raggio luminso soffre di minore diffusione permettendo una densità di memorizzazine (vicinanza tra pit e land) molto maggiore. I dischi Blu-Ray sono già apparsi sul mercato con la nuova console di videogiochi ‘Playstation 3’ e hanno vinto una dura battaglia, per imporsi come nuovo standard, contro gli HD DVD (High Definition DVD), proposti da Toshiba, Sanyo e Nec, maggiormente compatibili con i vecchi DVD, soprattutto a livello di tecnologia di realizzazione (con possibilità quindi di riciclare gli impianti di fabbricazione), ma con capacità inferiore (20 GB per lato). Anche stavolta lo standard è stato imposto dal mondo dello spettacolo: i nuovi DVD devono contenere film di due ore, in alta definizione, con audio di alta qualità (sistemi 5+1 o 7+1); la vittoria di Blu-Ray su HD DVD si è avuta proprio quando tutte le maggiori aziende cinematografiche hanno scelto la soluzione proposta da Sony come supporto per la commercializzazione dei loro prodotti. Questa è stata anche una rivincita per l’azienda giapponese che uscì sconfitta, ad inizio anni ’80, in una battaglia simile per i videoregistratori: la tecnologia VHS fu preferita alla Betamax di Sony, da molti ritenuta migliore e diffusasi poi solo in Giappone. Per quanto riguarda il mondo dei PC, solo da poco sono disponibili lettori e masterizzatori per dischi Blu-Ray, ma il loro costo, come quello dei dischi stessi, è ancora abbastanza alto.
Il Personal Computer
57
3.4.3.5 Memorie flash e unità SSD Le memorie flash si stanno diffondendo sempre di più negli ultimi anni nel campo delle memorie di massa; sono in pratica delle memorie ROM che però possono essere riscritte (quindi sono EEPROM) molte migliaia di volte. I loro punti di forza sono l’economicità, la comodità di trasporto e la velocità di accesso. Possiamo suddividere questa famiglia di dispositivi in tre categorie: • memory card o schede di memoria: sono usate prevalentemente per fotocamere e videocamere digitali, per i telefonini, per i lettori MP3; per usarle con il PC è necessario un lettore di schede di memoria interno o esterno ma sempre collegato a porte USB (nella figura 3.28 ne sono mostrati due, entrambi esterni; quello a sinistra è in grado di leggere praticamente tutti i formati e comprende anche un lettore di dischetti, quello a destra legge solo schede SD). F | igura 3.28.
La velocità di queste schede si misura con un fattore di moltiplicazione tenendo presente che 1X corrisponde a 150 KBps come per i CD; i tipi di schede più importanti sono: – Compact Flash (CF): proposte da una associazione di diverse aziende nel 1994; hanno dimensioni 43 x 36 mm e spessore di 3,3 o 5 mm; – SmartMedia Card (SM): della Toshiba, con dimensioni di 46 x 37 mm e spessore di 0,74 mm; sono ormai poco usate perché poco capienti e prive di controller interno; – Memory Stick (MS): della Sony, con dimensioni di 50 x 20 mm e spessore di 2,5 mm; disponibili anche nelle versioni Pro (più capienti) e Duo (più compatte); – MultiMediaCard (MMC): di SanDisk e Siemens, con dimensioni di 24 x 37 mm e spessore di 1,4 mm; molto piccole e compatibili con le successive SD; – SecureDigital (SD): di SanDisk, Matsushita e Toshiba (figura 3.29), con dimensioni di 24 x 37 mm e spessore di 1,4 mm (ma esistono anche in versioni più piccole, le MiniSD e le Micro-SD); sono al momento fra le più diffuse grazie alle elevate capacità (anche 2 o 4 GB) superate solo dalle CF, al controller integrato, alla possibilità di criptare il contenuto; – xD-Picture (XD): di Fuji e Olympus, con dimensioni di 25,4 x 20 mm e spessore di 1,5 mm; nascono per sostituire le SmartMedia e, come loro, sono prive di controller.
58
Il Personal Computer F | igura 3.29.
• UFD (USB Flash Drive): sono note anche come pendrive o chiavette USB e consistono in memorie di massa integrate con l’interfaccia USB (figura 3.30); sono molto comode, maneggevoli, poco costose e hanno capacità anche di diversi GB, tutti pregi che ne hanno fatto aumentare la popolarità, tanto che stanno soppiantando del tutto i dischetti come memorie di massa trasportabili. F | igura 3.30.
• SSD (Solid State Disk): sono memorie di massa in cui il termine «dischi» è usato impropriamente in quanto, pur avendo un aspetto esteriore simile ai dischi fissi (solitamente come quelli da 2,5 pollici) e pur essendo usati come tali, non hanno al loro interno alcun piatto in rotazione e sono invece costituiti da memorie flash. Soffermiamoci brevemente proprio sugli SSD, che stanno assumendo un ruolo sempre più importante in virtù di una serie di caratteristiche molto positive che possono essere così riassunte: • maggiore affidabilità e resistenza agli urti: non ci sono parti in movimento e delicati meccanismi di lettura/scrittura; • riduzione dei consumi: l’assenza di parti meccaniche in movimento permette un consumo inferiore durante le operazioni di lettura e scrittura in un SSD rispetto a un disco tradizionale; il risparmio energetico è però inferiore a quello che ci si potrebbe attendere, o che viene pubblicizzato dai produttori, in quanto nella condizione di riposo un SSD assorbe comunque una quantità apprezzabile di energia, maggiore di quella assorbita da un disco fisso nella medesima condizione; • minori tempi di accesso: 0,1 ms in un SSD contro i 5-15 ms di un disco fisso; questo permette di avere alcune migliaia di operazioni di I/O al secondo contro un centinaio e quindi le macchine equipaggiate con SSD hanno prestazioni migliori specie se gli accessi al disco sono di tipo casuale e si avviano in tempi notevolmente più brevi rispetto a macchine dotate di disco tradizionale; • nessun problema di frammentazione dei file: i tempi di accesso sono gli stessi in qualsiasi punto della memoria e quindi non ci sono ritardi in lettura dovuti al fatto che blocchi di dati dello stesso file non sono contigui.
Il Personal Computer
59
I vantaggi appena elencati giustificano l’utilizzo di questo tipo di memorie di massa soprattutto nel settore dei notebook e principalmente per i modelli mini denominati anche netbook, macchine dedicate principalmente alla connettività e all’uso in movimento, per le quali i bassi consumi e la rapidità di avvio sono fondamentali. Per quanto riguarda la velocità di trasferimento sequenziale dei dati non si riscontrano grossi vantaggi da parte delle memorie SSD che in qualche caso sono ancora superate da dischi fissi di buona qualità e con elevato regime di rotazione. I problemi più gravi degli SSD sono però i costi, ancora molto elevati, e le capacità, abbastanza basse; entrambi i difetti sono presumibilmente destinati a scomparire nei prossimi mesi. Esistono due tecnologie che sono alla base della realizzazione delle celle di memoria flash degli SSD: • SLC (Single Level Cell): in questo ogni cella può essere solo «piena» (valore 1) o «vuota» (valore 0); • MLC (Multi Level Cell): esistono più livelli per ogni cella, ad esempio quattro con la possibilità di memorizzare in ognuna i valori 00, 01, 10, 11. La tecnologia MLC permette ovviamente di avere memorie più capienti (si superano ormai i 100 GB) ma anche molto più lente specie in scrittura (anche di tre, quattro volte); infatti per scrivere un dato in una cella occorre prima svuotarla del dato precedente, poi verificarne lo svuotamento, quindi scrivere il nuovo dato, per un totale di tre operazioni. Con la tecnologia SLC tutto questo non è necessario e quindi si ha una velocità di accesso superiore; la capacità degli SSD di questo tipo si attesta sui 32 GB, per capacità maggiori i costi sono, al momento, proibitivi.
3.4.3.6 Gerarchia delle memorie Si parla di ‘gerarchia delle memorie’ per fare riferimento ad una classificazione in cui si rappresentatno i vari tipi di memorie informatiche sulla base di alcune loro caratteristiche importanti, quasi sempre la velocità e il costo. Tale gerarchia può essere rappresentata schematicamente come mostrato nella figura 3.31. F | igura 3.31.
60
Il Personal Computer
Possiamo osservare che anche la capacità, nello shema, cresce dall’alto verso il basso, con qualche piccola eccezione (la EEPROM usata in un PC è in quantità inferiore rispetto alla DRAM) Riguardo alla velocità sottolineiamo che l’unica memoria che «regge il passo» della CPU è la memoria locale, tutte le altre sono più lente; già la memoria centrale, che pure è velocissima, è circa 200 volte più lenta della CPU. Infine occorre notare che i passaggi dati avvengono preferibilmente, ma non esclusivamente, tra memorie appartenenti a livelli adiacenti della gerarchia e che le differenze di velocità tra i vari tipi di memoria introducono, come accennato varie volte in precedenza, grosse problematiche per il progetto del sistema di elaborazione. Nella tabella 3.32 vengono riassunti i valori indicativi relativi a dimensioni, tempo di accesso e velocità di trasferimento (in MBps, con eventuale indicazione della quantità di byte trasferiti in parallelo) di alcuni tipi di memoria (tali valori si riferiscono al periodo di diffusione degli ultimi processori Pentium IV e i primi con core multipli (tra il 2006 e il 2008). T | abella 3.32 Tipo di memoria Registri Cache L1 Cache L2 DRAM EEPROM SSD (SLC) SSD (MLC) Hard disk (SCSI) DVD (lettura) Nastro
Dimensione < 1 KB Alcuni KB Alcuni MB 2 - 4 GB Centinaia di KB 32 GB 128 GB Centinaia di GB 8,5 GB Alcuni TB
Tempo di acc. < 0,01 ns 0,16 ns 0,3 ns 2 ns 60-100 ns 0,1 ms 0,5 ms 5 ms 100 ms circa > 100 ms
Velocità di trasf. (in MBps) 400.000 o 800.000 (4 o 8 byte) 192.000 (32 o 64 byte) 96.000 (32 byte) 3.000 50-100 120 (read) 80 (write) 100 (read) 30 (write) 200 > 20 1
3.4.4 Periferiche di I/O In questo paragrafo facciamo una rapida panoramica sulle più importanti periferiche di I/O, con qualche approfondimento solo per le stampanti e i dispositivi di vissualizzazione (monitor e scheda video).
3.4.4.1 Tastiera e mouse La tastiera e il mouse sono ormai dispositivi la cui tecnologia è molto consolidata; le uniche novità che si sono avute negli ultimi anni sono dovute al lancio di modelli senza fili (prima a infrarossi, adesso con tecnologia bluetooth) e, nel caso dei mouse, alla sostituzione dei modelli dotati di rotellina con quelli ottici, più precisi e in grado di funzionare su qualsiasi superfice anche senza «tappetino». Recentemente sono apparse in commercio tastiere con vari tasti speciali e mouse con rotellina aggiunta ai consueti due o tre pulsanti allo scopo di facilitare lo scorrimento dei documenti aperti a video; queste novità possono essere sfruttate però solo se il sistema operativo e/o i programmi utilizzati prevedono la loro gestione (eventualmente grazie all’installazione di opportuni driver).
Il Personal Computer
61
3.4.4.2 Scanner Lo scanner è uno strumento che consente di digitalizzare vari tipi di documenti contenenti testi o immagini in bianco e nero e a colori. I documenti, così trasformati in segnali binari, possono essere manipolati dal computer, ad esempio con programmi di grafica o con programmi OCR (Optical Character Recogniction) per il riconoscimento del testo, e memorizzati nelle sue memorie ausiliarie. Fisicamente lo scanner è simile ad una fotocopiatrice (figura 3.33) ed è caratterizzato da: • ‘profondità di colore’, cioè il numero di colori riconosciuti, espressa secondo il numero di bit usati per ottenerne le combinazioni (ad esempio 32 bit per avere oltre quattro miliardi di colori); • ‘risoluzione ottica’, espressa in DPI (dot per inch) o punti per pollice. Più alti sono tali valori, migliore è la qualità dell’immagine catturata. F | igura 3.33.
In molti scanner le risoluzioni trasversale e longitudinale sono diverse: la prima dipende dalla distanza tra i sensori ottici, l’altra dal movimento degli stessi; valori abbastanza tipici sono 1200 x 2400 dpi. Esiste poi la ‘risoluzione interpolata’ grazie alla quale si ottengono, via software, immagini con più punti di quelli previsti dalla risoluzione ottica calcolandoni appunto con metodi di interpolazione; ovviamente però, per valutare la qualità dello scanner, è opportuno fare riferimento solo alla risoluzione ottica e alla profondità di colore.
62
Il Personal Computer
3.4.4.3 Scheda video e monitor Il sistema video di un PC è costituito da un monitor e da un controller, denominato scheda video. Le immagini rappresentate sul monitor sono formate da punti o pixel il cui numero fornisce la risoluzione, espressa indicando la quantità di pixel in orizzontale moltiplicata per quella in verticale. Altro parametro importante è la profondità di colore che dipende, insieme alla risoluzione, dalle caratteristiche della scheda video e principalmente dalla memoria RAM che quest’ultima possiede. Lo standard più importante per le schede video è il VGA (Video Graphics Adapter); nella figura 3.34, è mostrata la relativa porta, alla quale si collega il cavo proveniente dal monitor. F | igura 3.34.
Lo standard prevedeva in origine una risoluzione di 640 x 480 pixel ma si è poi evoluto nel seguente modo: • SVGA (Super VGA), risoluzione 800 x 600 pixel; • XGA (eXtended Graphics Array), risoluzione 1024 x 768 pixel; • SXGA (Super XGA), risoluzione 1280 x 1024 pixel; • UXGA (Ultra XGA), risoluzione 1600 x 1200 pixel; • QXGA (Quad XGA), risoluzione 2048 x 1536 pixel; • QSXGA (Quad SXGA), risoluzione 2560 x 2048 pixel; • QUXGA (Quad UXGA), risoluzione 3200 x 2400 pixel. Questo per quanto riguarda le risoluzioni tradizionali dette «4:3»; ci sono poi le risoluzioni «panoramiche» o «16:9» o «16:10»: • WXGA (Wide XGA), risoluzione 1366 x 768 pixel; • WSXGA (Wide SXGA), risoluzione 1600 x 1024 pixel; • WUXGA (Wide UXGA), risoluzione 1920 x 1200 pixel; • WQSXGA (Wide QSXGA), risoluzione 3200 x 2048 pixel; • WQUXGA (Wide QUXGA), risoluzione 3840 x 2400 pixel. Una moderna scheda video si collega sulla scheda madre allo slot AGP oppure ad un PCI-Express e possiede al suo interno quattro componenti fondamentali:
Il Personal Computer
63
• un accelleratore grafico o GPU (Graphic Processing Unit) che è a tutti gli effetti un processore aggiuntivo (quelli attuali sono a 128 bit, con densità di transistor a volte anche maggiore delle CPU e notevoli problemi di surriscaldamento); esso è specializzato per i calcoli grafici bidimensionali e tridimensionali e la sua presenza permette di non coinvolgere la CPU nelle elaborazioni grafiche con enormi guadagni nelle prestazioni generali del sistema; • memoria RAM, in quantità molto alta (che talvolta arriva a pareggiare l’ammontare della memoria RAM di sistema installata sulla scheda madre), indispensabile per memorizzare le immagini da visualizzare e contenere i dati per i calcoli dell’accelleratore grafico; è di tipo DDR2 o DDR3 ma modificata per lavorare a frequenze maggiori (e allora si parla di GDDR2 e GDDR3, dove G stà per Graphic); • un componente detto RAMDAC (RAM Digital to Analog Converter) che ha il compito di convertire i dati digitali elaborati dalla scheda grafica prima di inviarli al monitor (ovviamente nel caso quest’ultimo sia analogico); • il ‘video BIOS’ che fornisce l’accesso alle funzioni di base dell’hardware video facendo da interfaccia tra questo e i programmi che usano la scheda grafica; in pratica svolge funzioni simili al BIOS del sistema, del quale ci occuperemo nel paragrafo 3.5. Nella figura 3.35 vediamo una scheda video in cui si distinguono la presa VGA cui collegare il monitor, la GPU nascosta dal dissipatore di calore e, all’estrema sinistra, i chip di memoria. F | igura 3.35.
Occorre far notare che nei modelli di PC più economici, o per i quali le prestazioni grafiche non sono fondamentali, le funzioni della scheda grafica sono integrate direttamente sulla scheda madre; in questi casi una parte della RAM del sistema viene usata per le elaborazioni grafiche ed è questo il motivo per cui in molti PC di fascia bassa si riscontra un quantitativo di memoria centrale disponibile per i programmi e il sistema operativo inferiore a quello effettivamente presente sulla macchina. Il monitor è la principale periferica di output anche se ha a che vedere pure con la fase di input perché visualizza quanto digitato da tastiera e gli spostamenti del puntatore associati ai movimenti del mouse. I monitor più utilizzati fino a qualche tempo fa erano quelli CRT (Cathode Ray Tube), basati sulla stessa tecnologia degli apparecchi televisivi (figura 3.36), ma ormai sempre più soppiantati
64
Il Personal Computer
(come avviene d’altronde anche nel mercato dei televisori) dai modelli LCD (Liquid Crystal Display). F | igura 3.36.
Questi ultimi in precedenza erano usati solo per i PC portatili ma, con la continua discesa dei prezzi, sono divenuti la scelta migliore anche per i sistemi desktop (da tavolo) in quanto comportano un ingombro nettamente inferiore. La tecnologia attuale di monitor LCD è quella a ‘matrice attiva’ o TFT (Thin Film Transistor) che ha permesso di superare i gravi limiti della precedente denominata a ‘matrice passiva’. Non entriamo qui nei dettagli di funzionamento delle tecnologie CRT e LCD ma forniamo solo alcune informazioni generali e la descrizione di qualche parametro che influisce sulla qualità delle immagini visualizzate. Prima di tutto ripetiamo che per lungo tempo le schede grafiche hanno inviato ai monitor un segnale VGA analogico; questo per i monitor CRT non costituiva un problema, visto che sono dispositivi analogici, per gli LCD è invece necessaria una ulteriore conversione del segnale da analogico a digitale (ricordiamo che in origine i dati sono digitali e vengono trasformati in analogici dal RAMDAC della scheda video). Per evitare questa doppia conversione, e considerando che ormai la gran parte dei monitor è di tipo LCD, in molte schede video, soprattutto nei portatili, è previsto l’uso dell’interfaccia DVI (Digital Visual Interface) per fornire un flusso di dati digitale al monitor. Nei monitor i colori vengono ottenuto con il cosiddetto ‘metodo additivo’ che consiste nel creare un colore sommando varie quantità dei tre colori fondamentali: Red, Green, Blu, da cui la sigla RGB. Il metodo si chiama additivo perché i colori più luminosi si ottengono aggiungendo percentuali maggiori dei tre componenti fondamentali; in particolare se si aggiungono percentuali pari a zero si ottiene il nero, se pari al cento per cento si ottiene il bianco. Il metodo additivo è usato nei monitor e nello scanner perché sono dispositivi in grado di emettere luce; diverso sarà il caso delle stampanti per le quali si parlerà di ‘metodo sottrattivo’ (vedi paragrafo 3.4.4.4). Una considerazione importante da fare è che non si può utilizzare un apparecchio televisivo al posto di un monitor o viceversa, in quanto il segnale inviato al monitor è costituito da tre canali R, G, B separati più due segnali per il sincronismo mentre le TV gestiscono un segnale unico che comprende tutte le informazioni e che infatti viene detto RGB ‘composito’; naturalmente, in caso di bisogno, si può ricorrere ad appositi convertitori di segnale.
Il Personal Computer
65
I parametri da tenere maggiormente in considerazione per valutare la qualità di un monitor sono i seguenti: • forma: tradizionalmente la più consueta è quella 4:3 ma ora si stanno diffondendo sempre più i formati panoramici come il 16:9 o il 16:10, più adatti ad esempio alla visualizzazione di film o di videogiochi; • diagonale: espressa in pollici, dà la dimensione del monitor; attualmente i modelli più diffusi e meno cari sono quelli con diagonale di 17 e di 19 pollici; • luminosità, contrasto e angolo di visuale: sono da considerare soprattutto per i monitor LCD mentre i CRT non presentano criticità rispetto a tali parametri; in particolare l’angolo di visuale (angolo dal quale è possibile vedere le immagini come se fossimo davanti allo schermo) è bene che sia almeno di 150 gradi; • frequenza di rinfresco (refresh): deve essere di almeno 70 Hz per non affaticare gli occhi; questo parametro interessa però solo i monitor CRT e quindi non approfondiamo oltre natura e problematiche ad esso relative; • tempo di risposta: è importante per i monitor LCD e consiste nella velocità con cui si aggiornano i pixel; per avere una buona visualizzazione dei videogiochi e dei filmati occorrono valori di 25 ms, ma i modelli migliori scendono sotto i 20 ms; • dot pitch: è la distanza minima tra due punti e deve essere la più piccola possibile; un valore accettabile è 0,27 mm; • risoluzione: nei monitor CRT è un parametro che si può variare senza problemi perché non c’è una corrispondenza esatta tra i pixel elaborati dalla scheda video e i punti visualizzati sullo schermo (per questo di solito viene indicata la loro risoluzione massima); per i monitor LCD invece è un parametro vincolante in quanto essi sono costituiti da una matrice fisica di punti (le celle dei cristalli liquidi) e, se si aumenta la risoluzione, i punti mancanti vengono interpolati creando sbavature e imperfezioni nelle immagini; • numero di colori: questo è il punto di maggior difetto dei monitor LCD rispetto ai «vecchi» CRT che riescono a visualizzare tutti i colori visibili dall’occhio umano riproducendo in modo continuo (analogico) tutte le sfumature possibili; questo per la tecnologia TFT non è possibile (anche se ci sono continui miglioramenti) e quindi per applicazioni di grafica professionale sono ancora da preferire i monitor CRT.
3.4.4.4 Stampante La stampante è un’importante periferica di output che permette di ottenere i risultati delle elaborazioni su carta (hardcopy che si contrappone alla softcopy ottenibile sullo schermo); il costante abbassamento dei prezzi e i continui progressi tecnologici hanno fatto si che il suo utilizzo sia divenuto praticamente universale e con standard qualitativi molto elevati. Le stampanti si possono classificare in vari modi; una prima distinzione che possiamo fare è in base alla ‘tecnologia di stampa’: • stampanti ‘a impatto’: formano i caratteri spingendo un elemento meccanico contro un nastro inchiostrato posto tra l’elemento stesso e la carta; • stampanti ‘a non impatto’: formano i caratteri senza colpire la carta con elementi meccanici.
66
Il Personal Computer
Un’altra classificazione è in base alla ‘tecnica di trasferimento’: • stampanti ‘seriali’: stampano un carattere alla volta in sequenza; la loro velocita si misura in caratteri al secondo (cps); • stampanti ‘parallele’: trasferiscono su carta una riga di testo alla volta; la loro velocità si misura in linee al secondo (lps); • stampanti ‘a pagina intera’: formattano un’intera pagina e la trasferiscono l’hardcopy in un’unica soluzione; la loro velocità si misura in pagine al minuto (ppm). Infine possiamo avere una classificazione in base alla ‘tecnica per definire il carattere’: • stampanti ‘a carattere pieno’: realizzano la stampa di ciascun carattere in un corpo unico come le vecchie macchine da scrivere a margherita; • stampanti ‘a matrice di punti’: realizzano la stampa di ciascun carattere mediante l’accostamento di piccoli punti (vedi figura 3.37). F | igura 3.37.
I parametri più importanti per decidere sulla qualità di una stampante sono la sua velocità la ‘risoluzione di stampa’ espressa in dpi; riguardo al tipo di collegamento invece non ci sono grosse considerazioni da fare in quanto ormai tutte le stampanti prevedono il collegamento porte USB in sostituzione di quello parallelo. Una osservazione interessante riguarda il modo con cui vengono formati i colori nel caso della stampa: viene usato il ‘metodo sottrattivo’, basato sull’assorbimento della luce, secondo il quale ogni colore è ottenuto combinando quantità variabili dei colori fondamentali Cyan, Magenta, Yellow (da cui la sigla CMY) la cui somma globale fornisce il nero. Spesso però, per aumentare la qualità delle stampe dei caratteri del testo, viene aggiunto anche il nero come colore autonomo (la sigla diviene quindi CMYK dove K stà per blacK) e si parla di quadricromia anziché di tricromia; in caso di stampanti di alta qualità si può poi avere un numero ancora maggiore di inchiostri (esacromia). vediamo adesso quali sono i tipi di stampanti più diffuse attualmente o nel recente passato: • stampanti ‘a margherita’ (seriali, a impatto, a corpo unico): la testina di stampa utilizza un elemento chiamato margherita (a causa della sua forma), i caratteri sono posti all’estremità dei «petali» o raggi della margherita e vengono premuti contro il nastro di scrittura; la qualità di stampa è buona ma si tratta di stampanti molto lente (30-60 cps) e adatte solo alle stampe di puro testo, perciò sono da tempo in disuso; • stampanti ‘ad aghi’ (seriali, a impatto, a matrice di punti): la testina di stampa contiene un certo numero di minuscoli aghi (9 oppure 24) attivati da opportuni impulsi in base al carattere da stampare; per aumentare la velocità la stampa è di solito bidirezionale ma anche queste stampanti sono molto lente e quasi del tutto abbandonate;
Il Personal Computer
67
• stampanti ‘a getto di inchiostro’ (seriali, a non impatto, a corpo unico, vedi figura 3.38): la stampa avviene mediante l’invio sulla carta di minuscoli getti d’inchiostro che fuoriescono da decine di microscopici ugelli posti sulla testina di stampa equipaggiata con cartucce di inchiostro di colori diversi; sono stampanti veloci e molto silenziose che danno un’elevata qualità per le stampe anche a colori grazie al fatto che gli inchiostri sono liquidi e possono essere mescolati direttamente sulla carta; unico punto a sfavore sono i costi di gestione in quanto sono molto cari sia i fogli di carta speciale, indispensabili per le stampe di alta qualità, sia i ricambi delle cartucce di inchiostro (talvolta il loro costo supera quello della stampante); • stampanti ‘laser’ (a pagina intera, a non impatto, a corpo unico, vedi figura 3.39): sfruttano la luce di un raggio laser per creare l’immagine da stampare su un cilindro rivestito di materiale fotosensibile ruotante a velocità costante; la stampa si ottiene facendo aderire l’inchiostro in polvere (toner) caricato elettrostaticamente al cilindro per poi trasferirlo sulla carta tramite compressione e riscaldamento; sono stampanti molto veloci che forniscono risultati di ottima qualità con prezzi in continua discesa anche per i modelli a colori, anche in questo caso il problema è l’elevato costo dei materiali di consumo (cartucce di toner); • stampanti ‘a sublimazione’ (a pagina intera, a non impatto, a corpo unico, vedi figura 3.40): dedicate alla stampa di foto, utilizzano un processo di diffusione di inchiostri che, scaldati in modo variabile fino a 400 gradi, passano dallo stato solido a quello di sublimazione e vengono assorbiti dalla carta con gradazione dei colori e dimensioni dei punti variabili in dipendenza della temperatura; gli inchiostri corrispondenti ai colori fondamentali sono contenuti su pellicole di plastica poste su un tamburo sul quale scorre la carta e vengono scaldati e trasferiti uno alla volta, rendendo necessari quattro passi per completare il procedimento di stampa; questo causa una certa lentezza oltre che lo «spreco» delle pellicole, ognuna delle quali è usata solo parzialmente (per un solo colore fondamentale) e deve essere grande quanto la carta da stampare; la qualità è però la migliore in assoluto tra tutte le tecnologie di stampa ed è paragonabile a quella delle foto tradizionali anche rimanendo a risoluzioni molto basse (300 dpi); si tratta comunque di stampanti ancora abbastanza costose e che possono stampare solo su supporti di dimensione fissa e ridotta (10 x 15 o 13 x 18 cm). F | igura 3.38.
68
Il Personal Computer F | igura 3.39.
F | igura 3.40.
3.4.5 Interfacce di rete, modem e bluetooth In questo paragrafo esaminiamo velocemente le interfacce di rete il cui controller è integrato in tutte le moderne schede madre al pari del modem e accenniamo brevemente alla tecnologia bluetooth. Il fatto che il controller della scheda di rete e il modem siano integrati non pregiudica la possibilità di installare, su slot PCI, schede di rete migliori o aggiuntive e di usare schede modem, oppure modem esterni, USB o seriali. Nella figura 3.41 vediamo a sinistra la connessione RJ-45 per il cavo di rete e a destra la RJ-11 per il cavo telefonico del modem.
Il Personal Computer
69
F | igura 3.41.
In realtà spesso i modem integrati sono addirittura emulati via software e questo può costituire un problema se si vuole usare la macchina con sistemi operativi che non riconoscono queste periferiche «fittizie»; accade infatti spesso che esse siano correttamente supportate dalle varie versioni di Windows ma non da altri sistemi come Linux. Riguardo ai dispotivi di rete accenniamo solo che si fa sempre riferimento a reti LAN (Local Area Network) di tipo ‘Ethernet’ e W I F I (Wireless Fidelity), che sono di gran lunga le più diffuse. Nel primo caso è necessario un cavo di rete per collegare il PC ad un dispositivo chiamato switch, dotato di un numero di porte che va da 4 a 48, a cui saranno collegati anche gli altri dispositvi della rete; nel secondo caso è necessaria la presenza, nel raggio di qualche decina di metri, di un access point, dotato di antenna, che permette le comunicazioni tra i vari nodi della rete WiFi. Nella figura 3.42 vediamo un switch a 8 porte con un cavo di rete; nella figura 3.43 invece è mostrato un access point. F | igura 3.42.
F | igura 3.43.
70
Il Personal Computer
In questa sede non forniamo ulteriori approfondimenti su questi aspetti che necessitano della conoscenza almeno delle nozioni di base sulla struttura e il funzionamento dell’hardware e del software di rete, argomenti che non possono essere assolutamente «liquidati» in poche righe. Parlando di reti LAN può comunque valere la pena di citare due esempi di periferiche di rete, un po’ particolari, che però sono sempre più usate: • stampanti di rete: sono stampanti che possiedono una loro interfaccia di rete e sono ad essa direttamente collegate anziché ad uno specifico PC; possono essere usate da tutte le macchine presenti in rete; • NAS (Network Area Storage): sono dei sistemi di dischi collegati direttamente alla rete per mettere a disposizione spazio di memoria ai vari nodi della rete stessa. Nei PC portatili di ultima generazione sono spesso integrate anche le interfacce WiFi e bluetooth; in caso contrario si può ricorrere a comodi dispositivi simili alle penne USB di cui vediamo esempi nella figura 3.44 (la scheda wireless è quella a sinistra). F | igura 3.44.
La tecnologia bluetooth è senza fili come il WiFi ma si rivolge ad un altro tipo di utilizzo; in questo caso si parla infatti di PAN (Personal Area Network) per indicare tutti quei dispositivi di uso personale come telefonini, palm top, auricolari, ma anche tastiere e mouse, che gravitano in uno spazio molto ristretto (qualche metro) «intorno all’utente» e che sfruttano questa tecnologia per interconnettersi. Concludiamo parlando del MODEM (MOdulatore-DEModulatore); si tratta di un dispositivo (vedi figura 3.45) che permette il collegamento tra computer fisicamente distanti usando le normali linee telefoniche in quanto trasforma (in un modo che qui non approfondiamo) i segnali
Il Personal Computer
71
digitali (bit), propri degli elaboratori, in segnali analogici adatti a essere trasportati su tali linee (originariamente progettate per la comunicazione vocale). F | igura 3.45.
Se due computer distanti (chiamiamoli C1 e C2) si devono scambiare informazioni saranno necessari due modem (rispettivamente M1 e M2), uno per ogni elaboratore, collegati alla linea telefonica; se il computer C1 invia un messaggio questo sarà convertito (modulato) in analogico da M1 e instradato sulla linea; all’arrivo presso C2 il messaggio viene riconvertito (demodulato) in digitale da M2. Se è C2 a inviare un messaggio i ruoli dei dispositivi sono naturalmente invertiti. I modem si classificano secondo la loro velocità, misurata in base ai bit al secondo che riescono ad inviare o ricevere; gli apparecchi di ultima generazione arrivano a 55.600 bps ed i loro prezzi sono ormai molto bassi (poche decine di euro). Da qualche tempo è possibile collegarsi al provider anche con l’ADSL (Asymmetric Digital Subscriber Line), che sfrutta, nelle zone raggiunte dal servizio, le normali linne telefoniche. In tal caso si possono raggiungere velocità tra i 640.000 e i 20.000.000 bps in ‘download’ (trasferimento dei dati dal provider al nostro computer) e tra i 128.000 e i 512.000 bps in ‘upload’ (trasferimento inverso); ovviamente gli abbonamenti ADSL sono tutti a pagamento. Anche per l’ADSL è necessario un dispositivo aggiuntivo che può essere un modem ADSL USB oppure un ‘router’ADSL (vedi figura 3.46 in cui sono mostrati anche il cavo e la presa telefonica) a cui ci si collega con un cavo di rete; la seconda alternativa è migliore perché spesso il router ADSL ha anche funzioni di switch (con almeno quatro porte) e talvolta pure di access point WiFi, a costi sempre abbastanza contenuti. F | igura 3.46.
72
Il Personal Computer
Nel caso del modem ADSL, usare il termine «modem» è comunque scorretto in quanto si tratta solo di un adattatore; infatti non è necessaria alcuna modulazione o demodulazione data la natura digitale dei segnali ADSL.
3.5 Il BIOS Il BIOS (Basic Input Output System) è un componente fondamentale del sistema di elaborazione ed è costituito da un insieme di programmi residenti nella memoria ROM del sistema. Il motivo per cui essi risiedono in tale tipo di memoria è che devono entrare in azione appena accesa la macchina, momento nel quale la memoria RAM, essendo volatile, ha un contenuto impredicibile e comunque non «utilizzabile» e le memorie di massa non sono state ancora «riconosciute». In verità, nei sistemi moderni, il BIOS risiede in una memoria EEPROM in modo che sia possibile aggiornarlo (operazione da compiere sempre con attenzione, consultando il sito della casa produttrice del BIOS e il manuale della scheda madre). Subito dopo l’accensione, comunque, il BIOS viene copiato in RAM perché essa ha tempo di accesso inferiori rispetto alla ROM e quindi le operazioni vengono eseguite più rapidamente. Il primo compito svolto da questo insieme di programmi è l’autodiagnostica o POST (Power On Self Test) che consiste in un rapido controllo di quasi tutti i dispositivi del sistema di elaborazione; eventuali problemi in questa fase possono anche bloccare il processo di avvio: si provi ad esempio a accendere un PC con la tastiera non collegata. Durante questa fase di controllo, i vari dispositivi (eccetto quelli che hanno un BIOS «autonomo» come le schede video o le schede SCSI) vengono inizializzati in base alle informazioni contenute in una porzione di RAM chiamata CMOS (Complementary Metal Oxide Semiconductor). Quest’ultima è una piccola memoria che non perde il suo contenuto perché alimentata da una batteria a bottone che si ricarica quando la macchina è accesa, salvo esaurirsi dopo qualche anno, necessitando di sostituzione (vedi figura 3.1, lettera ‘J’). Grazie alla presenza di questa batteria i PC sono anche in grado di tenere aggiornata data e ora di sistema che altrimenti all’accensione si riposizionerebbe sempre a zero che corrisponde a 01/01/1980 per i sistemi DOS/Windows e a 01/01/1970 per i sistemi Unix/Linux (sono le date indicative in cui sono stati rispettivamente create le prime versioni di queste famiglie di sistemi operativi).
Il Personal Computer
73
Le informazioni sulla configurazione dei dispositivi contenute nella CMOS sono in buona parte modificabili da parte dell’utente che può intervenire sui settaggi del BIOS premendo un opportuno tasto nei primi momenti di «vita» del sistema (quale sia il tasto dipende dal BIOS utilizzato e occorre quindi prestare attenzione ai primi messaggi che appaiono a video dopo l’accensione, oppure consultare il manuale della scheda madre). Fra gli altri parametri configurabili ci sono anche le definizioni di due password, una per poter proseguire nell’avvio della macchina e una per accedere alla configurazione del BIOS; se si definiscono queste password e poi si dimenticano non si riesce più ad usare la macchina o a modificarne la configurazione e si deve necessariamente togliere momentaneamente la batteria (ovviamente a macchina spenta) in modo che il contenuto della CMOS si azzeri. Dopo la fase di POST viene eseguita la fase di bootstrap, che consiste nell’esecuzione di un piccolo programma che effettua la ricerca, sulle memorie di massa disponibili, del programma di caricamento di un sistema operativo (boot loader) o di un programma che interagisca con l’utente per la scelta del sistema da attivare (boot manager). L’ordine di ricerca sulle memorie di massa è uno dei parametri del BIOS che più spesso può essere necessario variare; ad esempio se si vuole avviare il PC dal lettore di CD o DVD, occorre che quest’ultimo sia impostato come primo dispositivo su cui cercare il programma di boot. Nella figura 3.47 viene mostrata proprio la schermata di un BIOS in cui si effettua la scelta dell’ordine di ricerca appena citato. F | igura 3.47.
74
Capitolo
Il linguaggio macchina
4
Si dice ‘istruzione macchina’ una istruzione corrispondente ad una operazione direttamente eseguibile dall’Hardware dell’elaboratore; l’insieme di tali istruzioni si chiama ‘Linguaggio macchina’. I programmi che devono essere eseguiti da un elaboratore elettronico devono risiedere in memoria centrale, secondo quanto proposto da John Von Neumann nel 1946. L’esecuzione avviene istruzione dopo istruzione in modo sequenziale e le istruzioni devono essere espresse in linguaggio macchina. Le istruzioni macchina hanno le seguenti caratteristiche: • sono codificate in forma binaria; • sono identificate da un codice che indica l’operazione da eseguire; • sono le sole istruzioni che un calcolatore può comprendere ed eseguire; • dipendono fortemente dall’architettura dell’elaboratore, dai registri della CPU, dalle varie unità funzionali; ne consegue che ogni elaboratore ha un proprio linguaggio macchina; • l’insieme delle istruzioni macchina eseguibili da un elaboratore costituisce il suo ‘repertorio’.
4.1 Il ciclo istruzione Come abbiamo visto in precedenza, l’esecuzione di ogni istruzione avviene grazie ad una serie di operazioni controllate dalla CU, che coinvolgono la memoria centrale, la ALU ed eventualmente altri dispositivi del sistema di elaborazione; tale serie di operazioni è chiamata ‘ciclo istruzione’. Un ciclo istruzione è costituito dalle seguenti fasi: 1. ‘Fetch’ o prelevamento: l’istruzione il cui indirizzo è specificato nel registro PC viene prelevata dalla memoria centrale e portata nel registro IR; al termine di tale operazione il valore del PC viene incrementato in modo da fare riferimento all’indirizzo della prossima istruzione da eseguire; 2. ‘Decode’ o decodofica: il decodificatore delle istruzioni interpreta il codice operativo dell’istruzione e invia opportuni segnali di attivazione dei dispositivi (ALU, controllori di I/O ecc.) che devono eseguire l’istruzione; 3. ‘Execute’ o esecuzione: l’operazione corrispondente all’istruzione viene eseguita. Ovviamente al termine di un ciclo istruzione inizia immediatamente quello riguardante la successiva istruzione.
Il linguaggio macchina
75
4.2 Descrizione e classificazione delle istruzioni macchina In generale una istruzione macchina può essere così schematizzata: Codice operativo
Operandi
La parte ‘codice operativo’ indica il tipo di istruzione (ad esempio 00000011 per la somma, 00000001 per lo spostamento ecc.); la sua lunghezza in bit è in relazione con il numero di istruzioni eseguibili dall’elaboratore: 2**K istruzioni se i codici sono lunghi K bit. La parte ‘operandi’ è variabile; la sua lunghezza e la sua presenza dipendono dal tipo di istruzione; in essa si fa riferimento a registri, ad indirizzi di celle di memoria o a entrambi. Naturalmente anche gli operandi sono indicati in binario. La lunghezza totale di una istruzione dipende dall’elaboratore e nello stesso elaboratore possono essere previste istruzioni di lunghezza diversa; essa è comunque sempre un multiplo della lunghezza di una cella di memoria; avremo quindi istruzioni lunghe 2, 4, 6 .... Byte.
4.2.1 Classificazione delle istruzioni per funzione svolta Le istruzioni macchina possono essere classificate nel seguente modo in base ai tipi di operazioni svolte: • ‘istruzioni di I/O’: servono per portare i dati all’interno o all’esterno dell’unità centrale dell’elaboratore; prevedono l’indicazione della periferica interessata e della locazione di memoria dove si trova il dato da portare all’esterno o dove si vuole immettere il dato proveniente dall’esterno; • ‘istruzioni aritmetico-logiche’: sono le istruzioni di manipolazione dei dati; devono essere indicati i dati su cui operare e la destinazione del risultato; • ‘istruzioni di spostamento’: servono a spostare dati da locazioni di memoria a registri della CPU o vicevera; • ‘istruzioni si salto’: servono a modificare la sequenza di esecuzione di un programma e devono contenere l’indirizzo di memoria dove si trova la prossima istruzione da eseguire. Fra le istruzioni di salto ne esistono di due tipi: • ‘incondizionato’: in questo caso il salto viene comunque effettuato; • ‘condizionato’: il salto si ha solo se è verificata una certa condizione da specificare nell’istruzione; tale condizione viene testata tramite l’esame di un opportuno bit del ‘registro di stato’. Per il sistema l’esecuzione di un istruzione di salto è molto semplice: viene scritto l’indirizzo a cui si deve saltare nel registro PC al posto dell’indirizzo della prossima istruzione. Supponiamo ad esempio che la CPU stia eseguendo l’istruzione memorizzata all’indirizzo 150 e che tale istruzione (qui scritta per semplicità in Italiano e non in binario) sia ‘salta a 200’ e occupi 2 byte; al termine della fase di fetch di tale istruzione il valore del PC viene posto a 152 (indirizzo della prossima istruzione da eseguire senza salti); dopo la fase di decode, che riconosce
76
Il linguaggio macchina
l’istruzione di salto incondizionato, quest’ultimo viene eseguito aggiornando il valore del PC a 200.
4.2.2 Classificazione delle istruzioni per numero di indirizzi Quando una istruzione macchina ha fra i suoi operandi dei dati contenuti nella memoria centrale deve far riferimento agli indirizzi in cui essi risiedono. Vediamo come si possono classificare le istruzioni in base al numero di indirizzo esaminando un piccolo esempio concreto: supponiamo di avere un elaboratore in cui gli indirizzi di memoria vengono indicati con 16 bit e i codici operativi con 8 bit; supponiamo inoltre di voler svolgere una somma tra il contenuto delle celle di memoria 10 e 12 ponendo il risultato nella cella 20 e che il codice operativo della somma sia 00000011. • ‘istruzioni a tre indirizzi’: |00000011 0000000000010100 0000000000001010 0000000000001100
in questa istruzione vengono specificati gli indirizzi dei due addendi e l’indirizzo del risultato (gli spazi sono inseriti per facilitare la lettura, in realtà l’istruzione sarebbe una stringa ininterrotta di 0 ed 1); le istruzioni a tre indirizzi non sono molto usate negli elaboratori a causa della loro lunghezza; quella qui proposta occuperebbe sette byte. • ‘istruzioni a due indirizzi’: |00000011 0000000000001100 0000000000001010
questa istruzione somma il contenuto della cella 10 al contenuto della cella 12 ed il risultato viene posto nella cella 12 cancellando così uno dei dati di paartenza; per portare il risultato nella cella 20 sarà quindi necessaria una successiva istruzione di spostamento del tipo: |sposta il contenuto della cella 12 nella cella 20 | |00000001 0000000000010100 0000000000001100
avendo supposto che il codice dell’istruzione «sposta» sia 00000001. • ‘istruzioni a un indirizzo’: le istruzioni di questo tipo si servono del registro accumulatore per contenere uno degli operandi ed il risultato: |00000011 0000000000001100
questa istruzione somma il contenuto della cella 12 al contenuto dell’accumulatore e pone il risultato nell’accumulatore; per poter raggiungere il nostro obiettivo tale istruzione deve essere preceduta da: |sposta nell’accumulatore il contenuto della cella 10
e seguita da:
Il linguaggio macchina
77
|sposta il contenuto dell’accumulatore nella cella 20
che per brevità non traduciamo in binario; • ‘istruzioni a zero indirizzi’: tale tipo di istruzioni è riscontrabile solo nelle cosiddette ‘unità centrali a stack’ o ‘stack processor’ le quali usano dei registri organizzati come una ‘pila’ (stack) gestita con la tecnica LIFO (Last In First Out) i dati sono memorizzati nei registri rispettando la sequenza di arrivo; l’estrazione di un dato dalla pila avviene dal registro valorizzato per ultimo; la somma del nostro esempio viene realizzata nel seguente modo: |00000011
questa istruzione preleva gli ultimi due dati presenti nella pila li somma e memorizza il risultato nella pila eliminando entrambi i dati di partenza; essa deve essere preceduta dalle seguenti istruzioni di inserimento nella pila (‘push’): |copia in testa allo stack il contenuto della cella 10 |copia in testa allo stack il contenuto della cella 12
e seguita dall’estrazione dalla pila (‘pop’): |preleva dato dallo stack e ponilo nella cella 20 (POP)
supponendo che x e y siano il contenuto rispettivamente delle celle 10 e 12 la successione delle operazioni è la seguente: Operazione inizio push 10 push 12 somma pop 20
Valori nella pila x y x x+y
Si noti che il concetto di unità centrale a stack è indipendente dall’utilizzo di parte della memoria centrale come stack, effettuato da molti elaboratori grazie ad un apposito registro detto ‘stack pointer’ (SP) che è il registro che contiene l’indirizzo della locazione di testa della pila. Un’altra classificazione delle istruzioni in linguaggio macchina (illustrata più avanti) è basata sul ‘modo di indirizzamento’, cioè sul modo in cui viene fatto il riferimento agli indirizzi delle celle di memoria contenenti i dati.
78
Capitolo
Il linguaggio assembly
5
Il linguaggio ‘assembly’ è il linguaggio di programmazione più a ‘basso livello’ cioè più vicino alla logica di funzionamento della macchina. Esso si distingue dai linguaggi di ‘alto livello’ come il ‘C’, il ‘Pascal’, il ‘COBOL’ e qualche altro centinaio che invece sono più vicini al modo di ragionare e operare dell’uomo e in varia misura specializzati per la realizzazione di soluzioni di problemi applicativi negli ambiti più vari. Il linguaggio assembly comunque costituisce già un importante passo in avanti rispetto al linguaggio macchina permettendo di superare alcuni grossi limiti di quest’ultimo.
5.1 Problemi nell’uso del linguaggio macchina Da quanto visto circa le caratteristiche del linguaggio macchina emergono in modo abbastanza netto le difficoltà nello scrivere programmi servendosi di questo strumento; in sintesi: • necessità di ricordare codici operativi costituiti da sequenze di cifre binarie prive di significato immediato per l’uomo; • necessità di fare riferimento direttamente a indirizzi di celle di memoria o a registri della CPU per potersi riferire agli operandi coinvolti nelle operazioni da svolgere; • necessità di fare riferimento a indirizzi di istruzioni per scrivere le istruzioni di salto; • difficoltà nella correzione dei programmi in quanto qualsiasi piccola modifica come l’aggiunta di una istruzione può comportare l’esigenza di modificare molte delle altre istruzioni; infatti per «far posto» alla nuova istruzione si devono spostare in memoria quelle che la seguono e forse anche i dati su cui il programma opera, quindi tutte le istruzioni di salto verso istruzioni spostate o che fanno riferimento a dati spostati devono essere modificate. Questi problemi vengono risolti nei linguaggi di programmazione, sia a basso che alto livello con l’uso di: • codici operativi mnemonici; • nomi simbolici per i dati in memoria (le cosiddette ‘variabili’); • etichette per contrassegnare le istruzioni.
5.2 Gli assembly E’ opportuno parlare di una pluralità di linguaggi assemblativi in quanto, esattamente come per il linguaggio macchina, ogni tipo di elaboratore (o meglio, di processore) ha il proprio. Infatti si può affermare l’assembly costituisce la ‘rappresentazione simbolica del linguaggio macchina’ e che c’è una corrispondenza «uno a uno» tra le istruzioni in assembly e quelle in linguaggio macchina. L’assembly, come accennato, ha però il grosso vantaggio di prevedere l’uso di codici operativi mnemonici, nomi di variabili e etichette per le istruzioni e quindi permette una scrittura dei programmi meno laboriosa anche se ancora vincolata alla conoscenza delle caratteristiche logiche e fisiche del sistema di elaborazione.
Il linguaggio assembly
79
Naturalmente un programma scritto in questo linguaggio non può essere immediatamente eseguito dall’elaboratore; esso deve essere prima tradotto in linguaggio macchina. Questa operazione viene svolta da programmi traduttori detti ‘assemblatori’ o ‘assembler’ sui quali viene fornita qualche informazione nel paragrafo 5.5.
5.3 Esempio di programma in linguaggio macchina e in assembly Vediamo, prima in un ipotetico linguaggio macchina e poi in un altrettanto ipotetico linguaggio assembly, un banale programma che effettui la sottrazione tra due numeri interi positivi, di cui il primo è il maggiore, togliendo ciclicamente una unità ad entrambi finchè il secondo numero non si azzera; a quel punto il primo numero sarà il risultato. Prima, per i lettori che già conoscono linguaggi più evoluti, vediamo una possibile soluzione in linguaggio C. |int |{ | | | | | | | | |}
main() int dato1,dato2,ris; dato1=15; dato2=12; while (dato2!=0) { dato1=dato1-1; dato2=dato2-1; } ris=dato1;
Supponiamo di avere un elaboratore con parole a 16 bit, con 16 registri numerati da 0 a 15 ciascuno dei quali può contenere un numero intero. Supponiamo poi che le istruzioni macchina siano composte da tre campi: il primo di 8 bit è il codice operativo, il secondo di 4 bit indica il registro, il terzo di 16 bit indica l’indirizzo di memoria della cella alla quale ci si vuole riferire. Le istruzioni da utilizzare sono le seguenti: Istruzione 01011000
X
Y
01010000
X
Y
01011011
X
Y
00000111
X
Y
10000010
Significato sposta nel registro X il contenuto della cella di indirizzo Y sposta il contenuto del registro X nella cella di indirizzo Y sottrai dal contenuto del registro X il contenuto cella di indirizzo Y salta all’istruzione di indirizzo Y se il contenuto del registro X è diverso da zero, altrimenti prosegui in sequenza stop
I due numeri da sottrarre si trovano nelle posizioni di indirizzo: |0000000010010110 |0000000010011000
= 150 = 152
e
80
Il linguaggio assembly
mentre la costante 1 è nella cella di indirizzo: |0000000010011010
= 154
il risultato verrà memorizzato nella cella di indirizzo: |0000000010011100
= 156
Il programma è posto in memoria a partire dalla posizione: |0000000001111010
= 122
Ogni istruzione occupa due parole (32 bit di cui 4 inutilizzati). Il programma in linguaggio macchina è il seguente: |Indirizzo | |0000000001111010 |0000000001111110 |0000000010000010 |0000000010000110 |0000000010001010 |0000000010001110 |0000000010010010
Istruzione (122)
01011000 0001 0000000010010110
(126)
01011000 0010 0000000010011000
(130)
01011011 0001 0000000010011010
(134)
01011011 0010 0000000010011010
(138)
00000111 0010 0000000010000010
(142)
01010000 0001 0000000010011100
(146)
10000010 0000 0000000000000000
Le prime due istruzioni caricano i contenuti delle posizioni 150 e 152 nei registri 1 e 2 rispettivamente; con la terza e la quarta si sottrae 1 ad entrambe; l’istruzione all’indirizzo 138 esegue il test sul secondo registro: se diverso da zero torna all’istruzione della cella 130 altrimenti passa alla successiva istruzione nella quale si memorizza il contenuto del registro 1 (che contiene il risultato) nella cella 156; quindi il programma termina. Lo stesso programma in assembly potrebbe essere: | mov | mov |ciclo: | | | | |
ax,dato1 bx,dato2 sub ax sub bx cmp bx,0 jne ciclo mov ris,ax end
dato1 e dato2 sono i nomi delle celle contenenti i dati, ris il risultato (in altre parole sono le variabili); ax e bx sono i registri; ciclo è una etichetta utilizzata per il salto. Si noti che qui non interessa più sapere in quali celle risiedono le istruzioni ed i dati, è compito dell’assemblatore, al momento della traduzione in linguaggio macchina, provvedere all’assegnazione degli indirizzi di memoria centrale.
Il linguaggio assembly
81
5.4 Modi di indirizzamento Le istruzioni macchina, e quindi le istruzioni dei vari linguaggi assembly si possono classificare anche in base al modo in cui viene fatto riferimento agli indirizzi di memoria dei dati coinvolti in esse. Si ha quindi la classificazione in base al ‘modo di indirizzamento’: • ‘indirizzo assoluto o diretto’: il valore indicato come operando è l’indirizzo della cella di memoria desiderata; • ‘indirizzo indiretto’: il valore indicato come operando è l’indirizzo della cella che contiene l’indirizzo della cella di memoria desiderata; • ‘indirizzo relativo’: il valore indicato come operando indica lo scostamento della cella desiderata dall’indirizzo dell’istruzione; in pratica l’indirizzo è dato prendendo come base l’indirizzo della cella contenente l’istruzione; quindi l’indirizzo effettivo viene calcolato sommando a quello relativo il valore contenuto nel registro PC; gli indirizzi relativi vengono usati quando le celle di memoria di un programma devono essere spostate in posizioni diverse della memoria fisica senza alterare gli indirizzi (‘codice rilocabile’); • ‘indirizzo indexato’: il valore indicato come operando viene sommato al contenuto di un registro (‘registro indice’ o XR) per ottenere l’indirizzo della cella di memoria desiderata; questo tipo di indirizzamento è adatto al caso di dati memorizzati in posizioni consecutive di memoria (‘vettore di memoria’); il numero usato è l’indirizzo di base del vettore, il valore del registro indice (offset) permette di riferirsi ad un particolare elemento; • ‘operando immediato’: il numero indicato come operando è il valore (costante) da usare nell’istruzione; in questo caso non è previsto alcun accesso in memoria. Sono previsti anche altri tipi di indirizzamento più complessi, come ‘indiretto indexato’, allo scopo di potenziare le possibilità della programmazione in assembly; d’altra parte questi indirizzamenti richiedono vari accessi in memoria e molti calcoli e quindi diminuiscono l’efficienza dei programmi.
5.5 Traduzione dei programmi assembly Come affermato in precedenza, la scrittura (editing) di un programma in linguaggio assembly è solo la prima operazione da compiere per arrivare a poter eseguire il programma stesso; è infatti poi necessario provvedere alla sua traduzione in linguaggio macchina, l’unico comprensibile ed eseguibile dal computer. Nello schema della figura 5.2 vediamo le varie fasi che conducono all’esecuzione del programma con l’indicazione del risultato prodotto da ogni fase e, in corsivo, dello strumento da usare per svolgere la fase stessa.
82
Il linguaggio assembly F | igura 5.2.
Nello schema i flussi di ritorno sono dovuti all’esigenza di dover coreggere il programma sorgente a seguito di eventuali errori riscontrati nella fase di traduzione e di linking (‘errori di sintassi’) oppure in sede di esecuzione (‘errori run-time’ o ‘errori logici’). Nel seguito descriviamo più in dettaglio solo le fasi di traduzione, linking e caricamento; per le altre diamo solo qualche indicazione. L’ editing del sorgente può essere effettuato con un qualsiasi editor di testo, anche molto elementare; esistono comunque anche strumenti, chiamati IDE (Integrated Development Environment), che mettono a disposizione tutto l’occorrente per gestire le varie fasi, dalla stesura del sorgente al collaudo. Riguardo al collaudo notiamo che esso può essere svolto dal programmatore che ha scritto il programma o anche a altre persone; può avvenire eseguendo il programma con dei dati di prova e, in caso si riscontrino errori o bug, può avvalersi di strumenti di aiuto per la loro individuazione chiamati debugger (il cui uso qui non approfondiamo).
5.5.1 Il programma assemblatore Una volta scritto il programma sorgente occorre passarlo in input all’assemblatore in modo da ottenerne la traduzione in codice macchina. Prima di illustrare come avviene tale operazione, ricordiamo che ogni categoria di processore ha il proprio ‘repertorio’ di istruzioni e quindi il proprio linguaggio macchina; di conseguenza anche il linguaggio assembly si differenzia in base al tipo di CPU e, in qualche caso, si hanno anche versioni diverse del linguaggio per lo stessa architettura di processore. Nel caso dei processori Intel x86 si hanno poi linguaggi assembly che sono basati su due modi diversi di scrivere le istruzioni e si parla di ‘sintassi Intel’ e ‘sintassi AT&T’; nel primo
Il linguaggio assembly
83
caso si tratta prevalentemente di prodotti per le piattaforme DOS/Windows, nel secondo per le piattaforme Unix/Linux (il riferimento a AT&T è dovuto al fatto che il primo Unix è nato presso tale azienda). Possiamo elencare alcune delle versioni di assembly x86 più diffuse e usate: • MASM (Macro Assembler), prodotto proprietario della Microsoft, basato sulla sintassi Intel e disponibile per le piattoforme DOS/Windows; • TASM (Turbo Assmbler), prodotto proprietario della Borland, basato sulla sintassi Intel e disponibile per le piattaforme DOS/Windows; • NASM (Netwide Assembler), prodotto libero e gratuito, basato sulla sintassi Intel e disponibile sia per DOS/Windows che per Unix/Linux; •
AS 86,
prodotto libero e gratuito, basato sulla sintassi Intel e disponibile per Unix/Linux;
• GAS (GNU Assembler), prodotto libero e gratuito creato nell’ambito del progetto GNU (GNU is Not Unix), basato sulla sintassi AT&T; disponibile nel mondo Unix/Linux, ma facendo parte del pacchetto ‘gcc’ lo troviamo anche nella versione di quest’ultimo per Windows, chiamata ‘cygwin’. L’uso di un linguaggio assembly piuttosto di un altro fa si che la stessa instruzione venga scritta in modo anche molto diversi; ad esempio lo spostamento del contenuto del registro bx in ax viene scritto con le seguenti istruzioni, rispettivamente in GAS e in NASM: 1 2 3 4
|; GAS |mov %bx, %ax |;NASM |mov ax, bx
Dopo la traduzione però si ottiene la stessa istruzione macchina (il linguaggio macchina per quel tipo di CPU è unico) espressa in esadecimale come: 89d8. Lo scopo di questo paragrafo è fornire alcune conoscenze generali su come viene reso eseguibile un sorgente assembly e su come opera un assemblatore e non illustrare tutti i dettagli sull’uso di una delle possibili versioni alternative del linguaggio; di conseguenza non approfondiamo, in questa sede, neppure le differenze esistenti tra sintassi Intel e sintassi AT&T. Per questi aspetti più pratici, relativi alla programmazione assembly, si possono consultare le dispense dello stesso autore dal titolo: «Programmare in assembly in GNU/Linux con sintassi AT&T» reperibili all’indirizzo hhttp://www.maxplanck.it/materiali i selezionando la scelta «VEDI MATERIALE» e cercando poi in base al docente scegliendo il nome Ferroni Fulvio. Ci serviamo comunque di un piccolo esempio di sorgente scritto in assembly NASM in modo da poter spiegare più agevolmente in che modo opera il programma assemblatore. 1 2 3 4 5 6 7 8
|; Dati |segment data |num1 db 150 |num2 db 200 |tot dw 0 |; Istruzioni |segment code |..start:
84
Il linguaggio assembly
9 10 11 12 13 14 15 16 17
| mov | mov | mov | mov | add | mov |fine: | mov | int
ax, data ds, ax ax, 0000h ; pulisce il reg. ax al, [num1] al, [num2] [tot], ax ah, 4ch 21h
Nel listato la numerazione è stata aggiunta per facilitarne la descrizione; le righe o le stringhe che iniziano con «;» sono dei commenti. Il programma svolge una elaborazione molto banale che consiste nel sommare due valori contenuti nelle celle di memoria corrispondenti alle etichette num1 e num2, ponendo poi il risultato nella cella identificata dall’etichetta tot. Il calcolo viene fatto usando il registro accumulatore ax, o meglio la sua metà «bassa» al, e avviene nelle righe tra la 11 e la 14. A riga 15 è definita una etichetta istruzioni fine: che è inserita solo a scopo dimostrativo; servirebbe per i salti, ma qui non viene utilizzata. Le altre istruzioni (righe 9-10 e 16-17) sono «fisse» ed essenziali per il funzionamento di qualsiasi programma scritto in NASM, ma qui non vengono approfondite. Nella prima parte del listato (righe 2-5) sono definiti i dati che il programma deve utilizzare; si tratta del ‘segmento dati’, seguito poi dal ‘segmento istruzioni’. Il fatto che il programma sia suddiviso in segmenti (ci sarebbero anche un ‘segmento stack’ e un ‘segmento extra’ che qui non vengono usati) rispecchia la gestione segmentata della memoria da parte dei processori x86. In questo piccolo esempio sono presenti tutti i tre tipi di istruzioni che si possono trovare in un sorgente assembly, e precisamente: • ‘dichiarative’: sono le istruzioni che servono a dichiarare le etichette corrispondenti ai dati usati dal programma; • ‘esecutive’: sono le vere e proprie istruzioni corrispondenti alle azioni che l’esecutore dovrà svolgere; • ‘direttive’: non si tratta di istruzioni del linguaggio assembly ma di istruzioni rivolte all’assemblatore per fornirgli informazioni utili alla traduzione del programma. Per la precisione, nel nostro esempio, le direttive sono alle righe 2, 7 e 8 e informano l’assemblatore di quali sono il segmento dati e il segmento istruzioni e di dove inizi la parte esecutiva del listato. Alle righe 3 e 4 abbiamo due istruzioni dichiarative contenenti etichette dati, alla riga 15 una etichetta istruzioni, le altre (a parte i commenti) sono esecutive. In precedenza avevamo accennato al fatto che esista una corrispondenza «uno a uno» tra istruzioni macchina e istruzioni assembly; questo è vero se si considerano tra queste ultime solo le esecutive e se non si considerano quelle che richiamano sottoprogrammi o routine come ‘int 21h’ (genera un interrupt software corrispondente al codice esadecimale 21 che fa eseguire la routine di chiusura dell’esecuzione).
Il linguaggio assembly
85
L’assemblatore non traduce in binario le istruzioni direttive e neppure le dichiarative; le prime, come detto servono a passargli informazioni circa lo svolgimento del suo compito, le altre le usa per una prima fase della traduzione che ci accingiamo a descrivere. I compiti di un assemblatore sono i seguenti: • tradurre in linguaggio macchina il programma sorgente, fornendo come risultato il programma oggetto; • segnalare eventuali errori nella sintassi delle istruzioni; • presentare (a video o su file) in forma leggibile (testo ASCII) il listing del programma oggetto; si tratta di ul listato contenente informazioni sulla traduzione di ogni istruzione del sorgente e sugli indirizzi di memoria in cui risiedono le istruzioni tradotte e i dati da elaborare. Tutti gli assemblatori svolgono la loro funzione di traduzione in ‘due passate’: • nella prima passata controllano la sintassi delle istruzioni, interrompendosi e fornendo opportune segnalazioni in caso di errore, e creano una tabella chiamata ‘tavola dei simboli’ in cui inseriscono tutti i simboli o etichette (dati e istruzioni) incontrate e i corrispondenti indirizzi di memoria calcolati automaticamente; • nella seconda passata avviene la traduzione vera e propria in codice macchina, fatta usando la tavola dei simboli precedentemente creata e la ‘tavola dei simboli predefiniti’, specifica di ogni assembly e che contiene i corrispondenti binari dei codici operativi delle istruzioni. Il motivo per cui sono necessarie due passate è che durante la traduzione si possono incontrare riferimenti simboli ancora non definiti che l’assemblatore non saprebbe come «risolvere». Vediamo più in dettaglio cosa avviene nella prima passata: • ogni riga del programma sorgente viene suddivisa nei suoi elementi di base (etichetta, codice mnemonico, operandi ecc.); • se l’etichetta è presente viene memorizzata con il suo indirizzo nella tavola dei simboli; • vengono decodificati il codice mnemonico dell’istruzione, gli identificatori dei registri e il modo di indirizzamento usato nell’istruzione; • viene inserito il codice macchina relativo all’istruzione appena tradotta e viene registrato il suo indirizzo; • in base alla lunghezza in celle di memoria dell’attuale istruzione macchina, viene calcolato l’indirizzo della successiva. Anche per la seconda passata entriamo più in dettaglio: • se la riga contiene un’etichetta, essa viene cercata nella tavola dei simboli e il corripondente indirizzo viene posto all’interno dell’istruzione macchina; • se la riga contiene un dato numerico o un gruppo di caratteri ASCII, ne viene calcolato l’equivalente esadecimale e inserito all’interno dell’istruzione macchina;
86
Il linguaggio assembly • se la riga contiene un’istruzione di salto, viene cercata nella tavola dei simboli l’etichetta a cui si deve saltare e il suo indirizzo viene inserito all’interno dell’istruzione macchina.
Nella descrizione delle operazioni svolte nelle due passate si è fatto più volte riferimento a indirizzi di dati e istruzioni; essi si riferiscono ad uno spazio «fittizio» di memoria detto ‘spazio logico’, che può o non può coincidere con lo ‘spazio fisico’ che verrà assegnato al programma eseguibile. Nel primo caso si parla di programma ‘assoluto’, nell’altro di programma ‘rilocabile’. Se il programma è rilocabile, gli indirizzi dello spazio logico sono indirizzi ‘relativi’, calcolati rispetto all’inizio del programma (indirizzo relativo zero); essi potranno essere variati in sede di linking quando, come vedremo tra breve, il nostro modulo oggetto viene unito ad altri moduli oggetto e lo spazio di memoria diviene unico. La loro trasformazione in indirizzi reali o ‘assoluti’ avviene nel momento del caricamento in memoria centrale per l’esecuzione, grazie ad’una operazione denominata ‘rilocazione’. Un’altra osservazione importante riguarda i simboli o etichette che, come abbiamo visto, possono essere predefiniti oppure no; nel secondo caso si possono ulteriormente distinguere in: • ‘simboli locali’: definiti nel programma e riferibili (usabili) solo al suo interno; • ‘simboli globali’: definiti nel programma ma riferibili anche da parte di altri moduli (programmi); • ‘simboli esterni’: riferiti nel programma ma definiti in altri moduli. Nel caso dei simboli esterni l’associazione ai rispettivi indirizzi relativi non può essere fatta dall’assemblatore in quanto essi non sono definiti nel programma che è in fase di traduzione; tale operazione è «rimandata» alla fase di linking, nella quale il nostro modulo aggetto è unito ad altri moduli oggetto in cui deve esistere la definizione di tali simboli (altrimenti viene segnalato un errore fatale che impedisce la creazione del programma eseguibile).
5.5.2 La fase di linking La fase di traduzione non conduce alla creazione del programma eseguibile perché è necessaria una ulteriore operazione chiamata linking (l’unico termine italiano che possa essere una traduzione accettabile è «collazione», ma si preferisce usare il termine inglese) compiuta da un programma linker. In questa fase il nostro modulo oggetto viene unito ad altri moduli oggetto che possono essere: • moduli di libreria già pronti, detti anche di supporto run-time, indispensabili per il funzionamento del programma; • moduli oggetto scritti dal programmatore, anche in linguaggi diversi da quello usato per il primo modulo. Contemporaneamente viene anche completata l’assegnazione degli indirizzi ai simboli definiti come esterni in qualche modulo e vengono aggiornati tutti gli indirizzi rilocabili. Al termine si ha la creazione del programma eseguibile con il suo spazio logico di memoria, pronto ad essere caricato nella memoria centrale per l’esecuzione. Quello appena descritto è però solo uno dei modi in cui può avvenire il linkink; abbiamo infatti:
Il linguaggio assembly
87
• ‘linking statico’: è quello appena descritto, in cui tutti i moduli oggetto necessari vengono inseriti una volta per tutte nell’eseguibile; • ‘linking dinamico’: i moduli vengono richiamati solo al momento del bisogno durante l’esecuzione (un esempio molto noto di questa modalità di linking si ha con i file «.dll» dynamic linking library usati in ambiente Windows). Il linking statico ha il vantaggio di assicurare migliori prestazioni da parte dell’eseguibile, che non deve interrompersi per il caricamento di moduli ulteriori ed è preferibile se si vuole creare un programma il più possibile indipendente dall’ambiente in cui sarà eseguito (in quanto ha al suo interno tutti i moduli che servono per farlo funzionare). Il linking dinamico, d’altra parte, permette di ottenere programmi eseguibili molto più snelli e non costringe a ricreare di nuovo l’eseguibile ogni volta che viene fatta una piccola modifica ad un qualsiasi modulo (basta tradurre solo il modulo modificato in modo da avere il rispettivo modulo oggetto aggiornato). Nei moderni ambienti operativi si preferisce l’alternativa del linking dinamico ma si puà ricorrere a quello statico qualora esigenze particolari lo richiedano.
5.5.3 Il caricamento del programma Quando un programma viene lanciato in esecuzione c’è un’ulteriore fase che deve essere svolta e che consiste nel ‘caricamento del programma’ in memoria centrale; talvolta non ci si accorge della presenza di questa operazione a meno che il programma non sia molto grande e richieda quindi un tempo abbastanza lungo per essere trasferito. Tale compito è svolto dal programma loader che copia l’eseguibile dalla memoria di massa in cui esso è conservato nella RAM. Ricordiamo che questo passo è essenziale affinché il programma possa essere eseguito in accordo con il concetto di ‘programma memorizzato’ espresso da Von Neumann nel 1946. Possiamo avere due tipi di caricamento: • ‘caricamento statico’: viene effettuato una volta per tutte e l’assegnazione dello spazio di memoria al programma non può variare durante tutta la sua esecuzione; • ‘caricamento dinamico’: viene effettuato anche a più riprese ed eventualmente in modo parziale, lo spazio fisico assegnato al programma eseguibile può variare durante l’esecuzione; ciò è reso possibile dalle tecniche di allcazione dinamica della memoria (‘memoria virtuale’) che tutti i moderni sistemi operativi sono in grado di gestire. Notiamo anche che il caricamento in memoria può essere dinamico solo se il programma è rilocabile.