Sei sulla pagina 1di 91

Architettura dei sistemi

di elaborazione, PC e
linguaggi a basso livello
Fulvio Ferroni fuferro@tin.it

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 fuferro@tin.it
Via Longarone, 6 - 31030 - Casier (TV)
Le informazioni contenute in questa opera possono essere diffuse e riutilizzate in base alle con-
dizioni 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 licen-
za, 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 stes-
sa. 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 Fattore di forma della scheda madre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.2 Il chipset della scheda madre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1.3 Bus di sistema e bus di I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1.4 Componenti integrati e altri elementi nella scheda madre . . . . . . . . . . . . . . . . 23
3.2 Il processore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2.1 Ampiezza in bit dei registri della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2.2 Frequenza del clock della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2.3 Tecnologia costruttiva dei processori (legge di Moore) . . . . . . . . . . . . . . . . . . 25
3.2.4 Numero di pin della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.5 Gestione della memoria da parte della CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.6 Architetture dei processori (pipeline e predizione) . . . . . . . . . . . . . . . . . . . . . . 28
3.2.7 Tipo di istruzioni delle CPU: CISC e RISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.8 Generazioni di processori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.9 Le CPU multicore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 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 1
Architettura di un sistema di elaborazione
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, deriva-
no 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.
| igura 1.1.
F

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’algo-
ritmo. 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 vie-
ne 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 determi-
nare 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 aritmetico-
logico, 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 del-
la 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.
| igura 1.2.
F

(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 dispositi-
vi 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 scam-
bio 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 chiama-
to ‘clock’ che è un generatore di impulsi di durata costante emessi uno dopo l’altro ad inter-
valli 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

| igura 1.3.
F

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 programmato-
re 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, alcu-
ne 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’ulti-
ma 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

| igura 1.4.
F

Il registro AC è collegato al bus dati in quanto può contenere operandi dell’operazione da svol-
gere 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 ope-
razione 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 esecu-
zione 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:
| igura 1.5.
F

Il ciclo di esecuzione di un programma da parte della CPU può essere rappresentato con un
diagramma di flusso come in figura 1.6:
| igura 1.6.
F
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 in-
formazione; 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 at-
traverso 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 pro-
grammi 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:


| igura 1.7.
F
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 pro-
blema 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 me-
tà 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 cir-
cuito 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 del-
la 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à infor-
matiche 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 par-
te 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 cel-
la, molto probabilmente negli istanti successivi accederà di nuovo a quella cella; ciò deri-
va 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 suc-
cessivo 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 ca-
che 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 esse-
re 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’elet-
tronica 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 2
Architettura del sistema AMC
L’AMC è un sistema di elaborazione progettato a scopi didattici che cerca di assicurare la chia-
rezza 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.
| igura 2.1.
F

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

| igura 2.2.
F

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).

| igura 2.3.
F

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).
| igura 2.4.
F

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).
| igura 2.5.
F

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 deco-
dificatore 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.
| igura 2.6.
F
19
Capitolo 3
Il Personal Computer
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 succes-
so 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 tecnolo-
gie 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.
| igura 3.1.
F
20 Il Personal Computer

Alcuni dei collegamenti elettrici assicurati dalle piste in rame servono a trasportare informazio-
ni 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’ali-
mentatore 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; in-
fatti 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 pro-
cessori, 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.
| igura 3.2.
F
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 mac-
china 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 work-
station 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 con-
siderare 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 con-
nettere 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 modifi-
ca 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 comun-
que 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 possia-
mo senz’altro installare una scheda audio PCI, con caratteristiche di gestione del suono profes-
sionali, 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 succes-
sivi: 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 mi-
croprocessori 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).

| igura 3.3.
F

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 immer-
gendo 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).
| igura 3.4.
F
26 Il Personal Computer

| igura 3.5.
F

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è tra-
mite 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 seg-
mentato 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 contempo-
raneamente, 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 eX-
tension) 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 au-


mentare il numero di processori coinvolti (senza ricorrere cioè al calcolo parallelo): si conside-
rano 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 mon-
taggio 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 equili-
brio 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 ef-
fettuata 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 diret-
tamente 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 sfre-
nata all’aumento della frequenza del clock (che invece Intel ha continuato ancora per qual-
che 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.

| abella 3.6
T
Bus Bus
Gen. Processore Archit. Microarc. Clock Anno
dati ind.
Prima 8086 - - 16 20 10 Mhz 1980
Seconda 80286 - - 16 24 20 Mhz 1982
Terza 80386 IA-32 i386 32 32 50 Mhz 1985
Quarta 80486 IA-32 i486 32 32 100 Mhz 1989
Quinta Pentium IA-32 P5 64 32 300 Mhz 1993
Pentium Pro, Pen-
Sesta IA-32 P6 64 36 1 Ghz 1995
tium II, Pentium III
Settima Pentium IV IA-32 Netburst 64 36 3,72 Ghz 2000
Ottava Itanium, Itanium-2 IA-64 Itanium 64 64 1,66 Ghz 2002
Intel 64 o
Nona CPU multicore Core 64 64 3 Ghz 2006
x86-64

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 pro-
cessori 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 deno-
minata ‘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 comple-
tato 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 inu-
tilizzati 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 (multi-
processore) 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 si-
stemi 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 manipo-
lazione di video e audio, la gestione di grosse basi di dati, la grafica, i servizi offerti in back-
grounddai 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).
| igura 3.7.
F
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 succes-
sice 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’ope-
razione 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).
| igura 3.8.
F

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 det-


ti ‘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 afferma-
tivo 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 sincro-
nia (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 perife-
rica, 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 usa-
re 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 ese-
guite 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 con-
tinuare 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 In-
tel 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 se-
gnale 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 notia-
mo, tra gli altri, i contatti contrassegnati con INTR (INTerrupt Request) e NMI (Not Maskable
Interrupt).
| igura 3.9.
F

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’archi-
tettura 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) termi-
na 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 è parti-
colarmente 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 Inter-
face) 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.
| igura 3.10.
F

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 con-
troller ‘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 trasferi-
mento 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).
| igura 3.11.
F

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 tec-
nologia 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 Num-
ber) 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.
| abella 3.12
T
Versione Standard Bus Conn. Clock bus Tasso trasf. Perif.
SCSI-1 SCSI-1 8 bit 50 fili 5 Mhz 5 MBps 8
Wide SCSI SCSI-2 16 bit 68 fili 5 Mhz 10 MBps 16
Fast SCSI SCSI-2 8 bit 50 fili 10 Mhz 10 MBps 8
Fast Wide SCSI SCSI-2 16 bit 68 fili 10 Mhz 20 MBps 16
Ultra SCSI SCSI-3 8 bit 50 fili 20 Mhz 20 MBps 8
Wide Ultra SCSI SCSI-3 16 bit 68 fili 20 Mhz 40 MBps 16
Ultra2 SCSI SCSI-3 8 bit 50 fili 40 Mhz 40 MBps 8
Wide Ultra2 SCSI SCSI-3 16 bit 68 fili 40 Mhz 80 MBps 16
Ultra160 SCSI SCSI-3 16 bit 68 fili 40 Mhz DT 160 MBps 16
Ultra 320 SCSI SCSI-3 16 bit 68 fili 80 Mhz DT 320 MBps 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.

| igura 3.13.
F

Nella figura 3.14 si vedono invece due porte USB (tipo A femmina) di un PC portatile.
| igura 3.14.
F

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 pirami-
dale 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

| igura 3.15.
F

L’organizazzione piramidale prevede un massimo di sette «piani» con il controller «logicamen-


te» 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.
| igura 3.16.
F

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 so-
lo 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 possi-
bilità 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 rispettiva-
mente) 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 sin-
cronizzazione 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 supplemen-
tare (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 inter-


nazionale 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 sup-
porti 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ù affida-
bile, 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 lette-
ralmente «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ò «smagne-
tizzarsi»), ma ha anche il difetto di non permettere la variazione delle informazioni registra-
te, 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).
| igura 3.17.
F

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 cita-
re, 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 contempora-
neamente 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.
| igura 3.18.
F

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

| igura 3.19.
F

| igura 3.20.
F

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).
| igura 3.21.
F
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 diffe-
renza 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: attual-
mente 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 picco-
la 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 defi-
nita 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 prodrut-
trici, con mutipli del byte ottenuti con potenze del dieci e non del due; quindi quando acqui-
stiamo 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 parti-
zione 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 for-
mattazione 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’occorren-
te 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: testi-
na 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 gesti-
scono 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 al-
lo 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 suddi-
videre 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).
| igura 3.22.
F

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 para-
metro 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).
| igura 3.23.
F

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

| igura 3.24.
F

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).

| igura 3.25.
F
54 Il Personal Computer

| igura 3.26.
F

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 rive-
stito 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.).
| igura 3.27.
F

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 me-
morizzata 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 memorizza-
zione; 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 mo-
mentaneamente 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 masterizza-
zione 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 esse-
re 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 con-
tenere 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 videoca-
mere 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).
| igura 3.28.
F

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 Mini-
SD 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

| igura 3.29.
F

• 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, ma-
neggevoli, 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.
| igura 3.30.
F

• SSD (Solid State Disk): sono memorie di massa in cui il termine «dischi» è usato impro-
priamente 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 tradizio-
nale; 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 supe-
riore; 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.
| igura 3.31.
F
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).
| abella 3.32
T
Tipo di memoria Dimensione Tempo di acc. Velocità di trasf. (in MBps)
Registri < 1 KB < 0,01 ns 400.000 o 800.000 (4 o 8 byte)
Cache L1 Alcuni KB 0,16 ns 192.000 (32 o 64 byte)
Cache L2 Alcuni MB 0,3 ns 96.000 (32 byte)
DRAM 2 - 4 GB 2 ns 3.000
EEPROM Centinaia di KB 60-100 ns 50-100
SSD (SLC) 32 GB 0,1 ms 120 (read) 80 (write)
SSD (MLC) 128 GB 0,5 ms 100 (read) 30 (write)
Hard disk (SCSI) Centinaia di GB 5 ms 200
DVD (lettura) 8,5 GB 100 ms circa > 20
Nastro Alcuni TB > 100 ms 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 esem-
pio 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 nu-


mero 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.


| igura 3.33.
F

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, imma-
gini con più punti di quelli previsti dalla risoluzione ottica calcolandoni appunto con metodi di in-
terpolazione; 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, dal-
le 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.
| igura 3.34.
F

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 pro-
cessore 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 coinvol-
gere 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 compi-
to 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 facen-
do 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.
| igura 3.35.
F

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).
| igura 3.36.
F

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 Tran-
sistor) 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 so-
no 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 oc-
chi; 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 aggior-
nano 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 elabo-
razioni 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).

| igura 3.37.
F

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 del-
la stampa: viene usato il ‘metodo sottrattivo’, basato sull’assorbimento della luce, secon-
do 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’estre-
mità 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): sfrut-
tano 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 sul-
la 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 subli-
mazione e vengono assorbiti dalla carta con gradazione dei colori e dimensioni dei punti
variabili in dipendenza della temperatura; gli inchiostri corrispondenti ai colori fondamen-
tali 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 pelli-
cole, 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 co-
stose e che possono stampare solo su supporti di dimensione fissa e ridotta (10 x 15 o 13 x
18 cm).

| igura 3.38.
F
68 Il Personal Computer

| igura 3.39.
F

| igura 3.40.
F

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

| igura 3.41.
F

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.
| igura 3.42.
F

| igura 3.43.
F
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).
| igura 3.44.
F

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 nor-
mali 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).
| igura 3.45.
F

Se due computer distanti (chiamiamoli C1 e C2) si devono scambiare informazioni saranno ne-
cessari 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’ (tra-
sferimento 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 tele-
fonica) 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.
| igura 3.46.
F
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 appe-
na accesa la macchina, momento nel quale la memoria RAM, essendo volatile, ha un contenu-
to 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 pos-
sibile 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 oppor-
tuno 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.
| igura 3.47.
F
74
Capitolo 4
Il linguaggio macchina
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 eventual-
mente 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 del-
l’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 som-
ma, 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 posso-
no 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à cen-
trale 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 pro-
gramma 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’i-
struzione; 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 risul-
tato (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 Valori nella pila
inizio
push 10 x
y
push 12
x
somma x+y
pop 20

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 5
Il linguaggio assembly
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’ag-
giunta 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 se-
guono 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 pro-
grammi 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 Significato
sposta nel registro X il contenuto della cella di
01011000 X Y
indirizzo Y
sposta il contenuto del registro X nella cella di
01010000 X Y
indirizzo Y
sottrai dal contenuto del registro X il
01011011 X Y
contenuto cella di indirizzo Y
salta all’istruzione di indirizzo Y se il con-
00000111 X Y tenuto del registro X è diverso da zero,
altrimenti prosegui in sequenza
10000010 stop

I due numeri da sottrarre si trovano nelle posizioni di indirizzo:

|0000000010010110 = 150 e
|0000000010011000 = 152
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 Istruzione
|
|0000000001111010 (122) 01011000 0001 0000000010010110
|0000000001111110 (126) 01011000 0010 0000000010011000
|0000000010000010 (130) 01011011 0001 0000000010011010
|0000000010000110 (134) 01011011 0010 0000000010011010
|0000000010001010 (138) 00000111 0010 0000000010000010
|0000000010001110 (142) 01010000 0001 0000000010011100
|0000000010010010 (146) 10000010 0000 0000000000000000

Le prime due istruzioni caricano i contenuti delle posizioni 150 e 152 nei registri 1 e 2 rispetti-
vamente; 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 ax,dato1
| mov bx,dato2
|ciclo: 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 co-
me 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 rela-
tivi 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 ba-
se 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 que-
sti 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

| igura 5.2.
F

Nello schema i flussi di ritorno sono dovuti all’esigenza di dover coreggere il programma sor-
gente 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 elemen-
tare; 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 |; GAS
2 |mov %bx, %ax
3 |;NASM
4 |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 sintas-
si 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 |; Dati
2 |segment data
3 |num1 db 150
4 |num2 db 200
5 |tot dw 0
6 |; Istruzioni
7 |segment code
8 |..start:
84 Il linguaggio assembly

9 | mov ax, data


10 | mov ds, ax
11 | mov ax, 0000h ; pulisce il reg. ax
12 | mov al, [num1]
13 | add al, [num2]
14 | mov [tot], ax
15 |fine:
16 | mov ah, 4ch
17 | int 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 conte-
nuti 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’assembla-
tore 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 istru-
zioni 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, fat-
ta 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 indi-
rizzi 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é è neces-
saria 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 accor-
ge 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 mo-
do parziale, lo spazio fisico assegnato al programma eseguibile può variare durante l’esecu-
zione; 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.