2011-08-28 13 views
6

Mi piacerebbe sapere come proteggere la memoria senza supporto MMU. Ho provato a google, ma non ho visto alcun documento degni di nota o di ricerca su di esso. E quelli che si occupano di esso si occupano solo di bug, come i puntatori non inizializzati e non il danneggiamento della memoria a causa di un errore soft, cioè a causa di un errore transitorio hardware che corrompe un'istruzione che scrive in una posizione di memoria.Protezione memoria senza MMU

Il motivo per cui voglio sapere questo è perché sto lavorando su una piattaforma manycore proprietaria senza alcuna protezione della memoria. Ora la mia domanda è: il software può essere utilizzato per proteggere la memoria, in particolare per le scritture wild a causa di errori soft (al contrario degli errori di un programmatore). Qualsiasi aiuto su questo sarebbe molto apprezzato.

+0

Wound't Valgrind fa quello che ti serve? –

+0

Non ne ho bisogno per il debug, ma evitando le scritture spontanee per danneggiare la memoria in fase di runtime. Fondamentalmente voglio un sistema sicuro e affidabile. – MetallicPriest

risposta

5

Se stai cercando la protezione della memoria di runtime, l'unica opzione sensata è il supporto hardware. L'hardware è l'unico modo per intervenire in un cattivo accesso alla memoria prima che possa causare danni. Qualsiasi soluzione software sarebbe vulnerabile agli stessi errori di memoria che sta cercando di proteggere.

Con il software è possibile implementare uno schema di verifica/rilevamento. È possibile controllare periodicamente porzioni di memoria a cui il programma attualmente in esecuzione non dovrebbe avere accesso e vedere se sono state modificate (probabilmente tramite CRCing in queste aree). Ma ovviamente se il programma canaglia danneggia l'area in cui sono conservati i checksum, o dove viene trattenuto il codice del programma di controllo, allora tutte le scommesse sono disattivate.

Anche questa soluzione di controllo software sarebbe più un'utilità di debug che una protezione runtime permanente. È probabile che un dispositivo senza MMU sia un piccolo dispositivo incorporato che non avrà i cicli di riserva per controllare costantemente la memoria del dispositivo.

Di solito i dispositivi senza MMU sono progettati per eseguire un singolo programma senza kernel o altro, e quindi non c'è nulla da proteggere. Se hai bisogno di eseguire più programmi e ritieni di aver bisogno di protezione, probabilmente hai bisogno di un hardware più avanzato che supporti il ​​tipo di funzionalità che stai cercando.

+1

Se la protezione della memoria può essere implementata nell'hardware, presumibilmente potrebbe essere implementata nel software. –

+1

@David: sicuro, emulando l'hardware. A quel punto sarebbe solo una macchina virtuale. Quindi la velocità dell'hardware reale entra in gioco. Presumibilmente questo ragazzo non è interessato a implementare la sua VM, perché sarebbe una specie di pazzo. – SoapBox

+1

Sono d'accordo con tutto ciò. Ho appena avuto problemi con te dicendo che l'hardware era l'unico modo. Forse potresti dire che l'hardware è l'unico modo realistico o sano. È tutto! –

2

Se si desidera la protezione della memoria implementata dal software, sarà necessario il supporto del compilatore e delle relative librerie associate. Mi aspetto che ci sia un compilatore solo su questa piattaforma e quindi dovresti contattare il venditore. Non aspetterei molte speranze per una risposta positiva. Anche se avessero questi strumenti, mi aspetterei che le prestazioni della protezione della memoria del software non siano accettabili.

+0

Che tipo di supporto. Voglio dire, quale sarebbe il meccanismo? – MetallicPriest

+3

Il compilatore normalmente scriveva una semplice istruzione di lettura o scrittura ogni volta che si accede alla memoria. Ma è necessario che ogni istruzione di questo tipo venga sostituita da una chiamata a una funzione di libreria che esegue la protezione runtime che si sta cercando. –

+0

... e se hai intenzione di andare a quell'estremo, potresti anche trasferire il tuo programma a es. Python o Lua e sii fatto con esso. Otterresti prestazioni migliori e probabilmente una stabilità simile. –

0

Dipende da quale piattaforma applicativa verrà eseguita. Esiste una tecnologia chiamata Type-Safe Language (ATS, ad esempio) che può proteggere dagli errori del software. E tali lingue possono avere buone prestazioni (di nuovo ATS, per esempio).

1

MMU meno sistemi sono presenti in diverse soluzioni integrate.

La memoria è gestita dal codice del kernel. L'intera memoria (heap) è divisa in liste di heap di varie dimensioni (le liste di heap possono essere di dimensioni 4 byte, 8 byte, 16 byte ..... fino a 1024 byte) e c'è un'intestazione allegata a ciascun blocco heap che indica se il blocco heap specifico è preso o meno. Pertanto, quando è necessario assegnare un nuovo blocco heap, è possibile sfogliare gli elenchi di heap e vedere quali blocchi heap sono liberi e assegnarli all'applicazione richiedente. E lo stesso accade quando si libera un blocco heap di dimensioni particolari, le intestazioni di quel blocco vengono aggiornate per riflettere che è stato liberato.

Ora, questa implementazione deve occuparsi dello scenario quando l'applicazione richiede una particolare dimensione del blocco heap e quella dimensione dell'elenco dell'heap è piena. In tal caso, separa un blocco dalla successiva dimensione dell'elenco di heap o unisci blocchi di heap di dimensioni più piccole e aggiungi all'elenco di heap di dimensioni richieste.

L'implementazione è molto più semplice di quanto possa sembrare.