[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home] [volume] [parte]


Capitolo 85.   Memoria centrale difettosa

Perché un sistema operativo possa funzionare correttamente, è necessario che la memoria centrale sia perfettamente efficiente, in quanto di norma non vengono applicate tecniche di ridondanza in questo ambito. Purtroppo, spesso la memoria centrale presenta invece dei difetti che si manifestano, in modo casuale, in alcune porzioni della stessa. Per fortuna, tra i parametri di avvio di un kernel Linux è possibile escludere le aree che hanno dimostrato di essere difettose. Naturalmente, per mettere alla prova la memoria centrale serve un programma diagnostico, da usare al di fuori del sistema operativo.

Va comunque osservato che l'utilizzo di un disco RAM iniziale o la dimensione particolarmente grande del file del kernel, può essere incompatibile con l'indicazione di alcune aree di memoria difettose.

85.1   Esclusione di altri fattori

Quando si verifica il funzionamento della memoria centrale, per esempio con programmi come quello descritto nella sezione successiva, gli errori che si possono riscontrare possono essere determinati da fattori estranei alla memoria stessa. Per esempio possono dipendere da difetti nella logica intermedia, tra la memoria e il microprocessore; possono dipendere da una configurazione errata nel BIOS; possono dipendere dallo sporco accumulato all'interno dell'elaboratore.

Quando si verifica la presenza di problemi con un programma diagnostico, la prima cosa che conviene fare è pulire l'elaboratore, per quanto possibile; soprattutto è bene rimuovere la memoria (ammesso che sia rimovibile) e pulire in particolare sia i moduli di memoria, sia i connettori dove questi vanno inseriti. Se dopo tale pulizia gli errori permangono, si può provare anche a scambiare i moduli tra i connettori, oppure si può provare a utilizzare qualche connettore che prima era libero. Se si dispone di altri elaboratori si può scambiare la memoria con quelli e ripetere l'esame diagnostico lì. Evidentemente, se in situazioni differenti si presentano gli stessi errori, oppure ne compaiono altri in zone vicine, è molto probabile che il difetto dipenda effettivamente dal modulo di memoria.

85.2   Memtest86+

Memtest86+(1) è un programma diagnostico per la memoria centrale che può funzionare con la maggior parte degli elaboratori x86. Il sito originale di distribuzione Memtest86+ è <http://www.memtest.org/>.

Questo programma, per eseguire il proprio lavoro, deve essere avviato autonomamente, al di fuori del sistema operativo, per esempio con GRUB 1 o sistemi di avvio simili, oppure da un dischetto o da un CD/DVD autoavviabile.

Si osservi che Memtest86+ richiede pochissima memoria per funzionare, quindi è possibile eseguire la verifica anche con moduli singoli, in modo da escludere i problemi causati dall'incompatibilità reciproca di moduli di memoria differenti.

Generalmente sono disponibili dei file-immagine già pronti, sia per dischetto, sia per CD/DVD. Eventualmente si può estrapolare facilmente il file binario memtestp.bin e lo si può far partire, per esempio con GRUB 1, usando, nel file menu.lst, direttive simili a quelle seguenti:

...
title  Memtest86+
kernel (hd0,0)/boot/memtestp/memtestp.bin
...

Nel caso di altri sistemi di avvio, può darsi che l'uso diretto del file memtestp.bin non sia possibile; in tal caso, si può predisporre un file-immagine di un dischetto, dove il contenuto di memtestp.bin è riportato, tale e quale, nei primi settori (dal primo in poi). Ciò è necessario in particolare con SYSLINUX. Supponendo di avere realizzato il file-immagine memtestp.dsk, il file di configurazione di SYSLINUX potrebbe contenere le direttive seguenti, dove va osservato l'uso particolare del file memdisk che deve essere presente nella stessa directory:

LABEL mem
 KERNEL memdisk
 APPEND initrd=memtestp.dsk

Appena avviato, Memtest86+ inizia a scrivere e a rileggere la memoria con vari tipi di modelli, segnalando gli indirizzi dove la lettura riporta un risultato diverso da quanto scritto. Gli indirizzi vengono indicati in esadecimale, con una traduzione approssimativa in mebibyte (simbolo Mibyte) che però non è esatta nella porzione decimale. Memtest86+ continua a funzionare senza sosta fino a quando l'elaboratore rimane acceso, oppure quando viene premuto il tasto [Esc] che provoca il riavvio del sistema. Eventualmente sono disponibili anche altri comandi, annotati alla base della schermata.

A titolo di esempio, potrebbe essere riportato un elenco di errori come quello seguente, nell'ambito di una memoria da 512 Mibyte:

0D05DF2816, 0D05DF6816, 0D05E32816, 0D05E42816, 0E05DCAC16, 0E05DF0816, 0E05DF4816, 0E05E30816, 0E05E40816, 1CBBFFBC16

Dal momento che Memtest86+ ripete continuamente la propria ricerca, è normale che gli indirizzi difettosi compaiano in modo disordinato; di conseguenza il riordino va fatto a mano.

Gli indirizzi rappresentano i byte che in memoria hanno manifestato il problema. Per utilizzare queste informazioni occorre mettersi a tavolino e tradurre i valori in base dieci (un programma come Gbase è ottimo per questo scopo) e poi può essere necessario calcolare gli spazi utilizzabili, ma considerando che conviene prendersi un po' larghi e prevedere che gli errori possono presentarsi in futuro in celle di memoria vicine a quelle che sono già state rilevate. Per esempio, dati i valori già ipotizzati, si potrebbe preparare una tabellina come quella seguente:

Indirizzo in base sedici Indirizzo in base dieci Indirizzo diviso 1 048 576
(indirizzo in mebibyte)
0D05DF2816 218 488 616 208,37
0D05DF6816 218 488 680 208,37
0D05E32816 218 489 640 208,37
0D05E42816 218 489 896 208,37
0E05DCAC16 235 265 196 224,37
0E05DF0816 235 265 800 224,37
0E05DF4816 235 265 864 224,37
0E05E30816 235 266 824 224,37
0E05E40816 235 267 080 224,37
1CBBFFBC16 482 082 748 459,75

A questo punto si comprende che gli errori si addensano negli intervalli 208-209 Mibyte, 224-225 Mibyte e 459-460 Mibyte.

85.3   Parametri di avvio del kernel

Per dire al kernel Linux che deve utilizzare solo una certa porzione della memoria centrale, si usa il parametro memmap=exactmap, seguito da altri parametri del tipo:

memmap=lunghezza[K|M|G]@inizio[K|M|G]

Per esempio, per dire al kernel di utilizzare lo spazio dei primi 640 Kibyte e poi di partire dal primo mebibyte (simbolo Mibyte) per arrivare alla fine dei 512 Mibyte (saltando quindi lo spazio successivo ai 640 Kibyte e precedente al primo mebibyte), si deve scrivere una cosa così:

memmap=exactmap memmap=640K@0 memmap=511M@1M

Precisamente, ciò significa che deve essere utilizzato lo spazio che inizia dall'indirizzo zero e si estende in avanti per 640 Kibyte, quindi si deve prendere quello che inizia da 1 Mibyte e si estende per altri 511 Mibyte. Come si comprende, anche per questo occorre mettersi a tavolino e fare bene i calcoli. Riprendendo l'esempio già descritto nella sezione precedente, la tabellina potrebbe essere estesa così:

Indirizzo in base sedici Indirizzo in base dieci Indirizzo in
mebibyte
Parametro del kernel
0D05DF2816 218 488 616 208,37
memmap=207@1M
0D05DF6816 218 488 680 208,37

 
0D05E32816 218 489 640 208,37

 
0D05E42816 218 489 896 208,37

 
0E05DCAC16 235 265 196 224,37
memmap=15M@209M
0E05DF0816 235 265 800 224,37

 
0E05DF4816 235 265 864 224,37

 
0E05E30816 235 266 824 224,37

 
0E05E40816 235 267 080 224,37

 
1CBBFFBC16 482 082 748 459,75
memmap=234M@225M
memmap=52M@460M

Per esempio con GRUB 1, nel file di configurazione per l'avvio si potrebbe scrivere così:

...
title  memoria difettosa
kernel (hd0,0)/vmlinuz root=/dev/hda1 ro memmap=exactmap \
  \      memmap=207@1M memmap=15M@209M memmap=234M@225M \
  \      memmap=52M@460M ...

Come si vede, per semplicità è stata omessa anche la porzione di memoria dei primi 640 Kibyte.


1) Memtest86+   GNU GPL


Appunti di informatica libera 2008 --- Copyright © 2000-2008 Daniele Giacomini -- <appunti2 (ad) gmail·com>


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome memoria_centrale_difettosa.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [home]

Valid ISO-HTML!

CSS validator!

Gjlg Metamotore e Web Directory