Protezione dati nelle memorie flash

Analizziamo in questo articolo per la rubrica Firmware Reload alcuni semplici accorgimenti per evitare di perdere i propri dati memorizzati su dispositivi di memoria flash.

La maggior parte dei sistemi embedded utilizza dispositivi flash di tipo NOR per la memorizzazione di dati, siano essi informazioni utente o codice eseguibile. La protezione dei dati, da cancellazione o sovrascrittura accidentali assume, quindi, come si può ben immaginare, estremo interesse, anche nelle applicazioni non critiche. Di seguito sono discussi alcuni semplici accorgimenti (suggeriti anche nell’Application Note di Sharp citata nei riferimenti [1]) che possono essere messi in atto per evitare problemi di questo tipo; sono anche presentate le funzionalità di protezione intrinseche offerte dai dispositivi stessi.

DAL PUNTO DI VISTA HARDWARE…

La maggior parte delle flash NOR dispone di ingresso di reset RST (o RP) che inizializza il dispositivo forzandolo in una modalità inattiva, nella quale tutte le operazioni correnti sono abortite. Finché la linea di reset è asserita, inoltre, il dispositivo non accetta ulteriori comandi, né tantomeno questi vengono latchati per essere eseguiti successivamente. Al power-up, in funzione della rampa di salita della tensione di alimentazione, può accadere che i dispositivi vedano segnali spuri sulle linee di controllo, con il rischio di interpretarli come comandi. È buona norma, pertanto, mantenere la linea di reset della flash asserita fino a che la tensione di alimentazione non si è stabilizzata oppure ogni volta che si riconosce un drop transiente sulla linea stessa. Se non si vogliono utilizzare dispositivi specifici di monitoring della tensione (come, ad esempio, il ben noto MAX705), può bastare anche il circuito mostrato in Figura 1. La costante di tempo del gruppo RC determina evidentemente il tempo di ritardo (rispetto al tempo di salita della tensione di alimentazione) con cui il segnale di reset viene rilasciato. Le porte invertenti con trigger di Schmitt servono, al solito, a squadrare opportunamente il segnale di reset.

Figura 1: un semplice circuito di reset al power-up (da [1]).

Figura 1: un semplice circuito di reset al power-up (da [1])

Se si sceglie di utilizzare un circuito di reset al power-up della flash, è tuttavia opportuno tenere presente il tempo entro il quale questa diventa accessibile (dopo il rilascio del reset) e quello invece in cui il microprocessore esegue il primo accesso alla memoria. È chiaro che se il primo è maggiore e la memoria è usata per contenere il codice eseguibile della CPU, il sistema non riuscirebbe a eseguire correttamente il boot. Se si usa lo stesso segnale per la flash e il microcontrollore, può essere utile ritardare il reset di quest’ultimo mediante un semplice circuito RC (e in cascata, ovviamente, trigger di Schmitt). Come ulteriore protezione da scrittura accidentale (legata ad esempio a glitch delle linee di controllo durante i transienti sull’alimentazione) può infine essere vantaggioso fare un AND logico del segnale di scrittura della flash con un GPIO del microcontrollore (per pilotare così l’ingresso di WE della memoria). Per abilitare la scrittura, la CPU dovrà prima portare a ‘1’ tale GPIO e poi eseguire l’accesso. Qualora si adotti questo accorgimento, è però opportuno che la porta AND sia posta il più vicino possibile alla flash.

Un’altra cosa da considerare è la seguente. In teoria, al power-up o dopo il reset, la flash si porta in una modalità del tipo Read Array in cui è abilitata la lettura dei dati interni. Sempre a causa di transienti sulle linee di controllo (incluse quelle di reset), durante le fasi di commutazione al power-up potrebbe accadere che la memoria accetti del rumore come comandi spuri e si porti quindi in un diverso stato, ad esempio di Status Register Read. Questo potrebbe portare a interpretare erroneamente i successivi comandi, con il rischio di sovrascrittura o cancellazione dei dati. Per evitare questo, potrebbe essere utile forzare la flash nella modalità corretta di Read Array, subito dopo il power-up, mediante specifico comando software; nel caso in cui le memorie supportino comandi istruiti mediante tre successivi accessi, è opportuno che il comando di reset software sia inviato per altrettante volte. Un altro accorgimento che si può applicare per prevenire sovrascritture accidentali della memoria flash consiste nel tenere disabilitata la tensione accessoria Vpp (per i dispositivi che ne facciano uso), se questa non è esplicitamente necessaria. Mancando, infatti, la tensione, anche nell’eventualità di un comando interpretato male nelle condizioni discusse finora, i dati memorizzati non sarebbero corrotti. Per commutare la tensione di programmazione Vpp della flash si può usare il circuito mostrato in Figura 2.

Figura 2: un circuito per commutare la tensione di programmazione delle memorie flash (da [1]).

Figura 2: un circuito per commutare la tensione di programmazione delle memorie flash (da [1])

Il gate del Mosfet può essere pilotato opportunamente direttamente da un GPIO del microcontrollore. Il Mosfet deve ovviamente essere scelto tenendo conto della sua resistenza interna, della corrente assorbita dalla memoria durante la programmazione e della tolleranza sui livelli di tensione per questa. La linea Vpp, come del resto anche la tensione di alimentazione principale, dovrebbero infine essere filtrate mediante opportuni condensatori di bypass per ridurre il rumore e i cali di tensione durante le operazioni di accesso al dispositivo. Infine, è opportuno ricordare che le memorie flash dispongono di ingresso di controllo WP che, se forzato a VIL, consente di proteggere da scrittura alcuni blocchi particolari, come ad esempio il primo, l’ultimo, i primi due o gli ultimi due (a seconda del modello e/o del produttore). Inoltre, spesso, tale controllo inibisce anche la modifica dei bit di protezione software (si veda di seguito) dei singoli blocchi. Fate attenzione al fatto che molti dispositivi condividono in realtà uno stesso ingresso per le linee VPP e WP e questo assume così funzioni diverse secondo il livello di tensione con cui è pilotato (VIL, VIH o VPPH).

… e da quello software

Oltre ai meccanismi di protezione hardware discussi in precedenza, praticamente tutti i dispositivi flash supportano metodi di protezione dei singoli blocchi mediante specifici comandi software istruiti alla memoria. Ogni blocco, ad esempio, dispone di bit di controllo di protezione che può essere asserito per inibire qualsiasi operazione di scrittura o cancellazione. In genere il dispositivo, qualora riceva un comando di write o erase per un blocco protetto, lo ignora e ritorna in una modalità di lettura. Alcuni dispositivi dispongono poi di un bit di controllo per la protezione dell’intera memoria e/o di un altro che consente di disabilitare la possibilità di cambiare di stato gli stessi bit di protezione dei singoli blocchi. In alcuni casi è anche supportata la possibilità di proteggere tali bit di lock da variazioni di stato mediante password a 64 bit; in questo modo, senza conoscere la corretta password (che ovviamente è programmabile dall’utente stesso prima di attivare la modalità corrispondente) non è possibile disabilitare. I bit di protezione dei singoli blocchi sono in genere memorizzati in modo volatile.

Al power-down, o dopo reset del dispositivo, il contenuto attuale viene perso e alla ripresa il dispositivo riparte quindi nella condizione di default (ad esempio, con tutti i blocchi non protetti). In realtà, alcuni dispositivi dispongono di capacità di memorizzazione dei bit di lock in modo non volatile (la protezione può essere abilitata singolarmente per ogni blocco ma rimossa soltanto per tutti i blocchi insieme) o addirittura permanente. In quest’ultimo caso, tuttavia, la protezione non può essere rimossa, trasformando, in definitiva, il blocco protetto in un’area di memoria ROM. Infine alcuni dispositivi più recenti supportano anche la protezione dei singoli blocchi da ogni tipo di accesso (scrittura, lettura o cancellazione) mediante password a 64 bit. È solo il caso di osservare che il meccanismo di protezione e unlock dei singoli blocchi descritto, sebbene simile nelle linee generali, presenta alcune differenze tra i vari modelli dei diversi produttori. È quindi buona norma assicurarsi del funzionamento del proprio dispositivo prima di utilizzare una particolare procedura di protezione della memoria.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend