Ripristino di un processo dopo un'eccezione di istruzioni illegali

1

In teoria è possibile recuperare dopo che un processo è stato erroneamente indicato per leggere da un indirizzo di memoria sbagliato, invece di terminarlo?

Diciamo che un errore mentre si lavora con i registri porta il processore a leggere un posto casuale nella memoria e quindi a lanciare un'eccezione di istruzioni illegali. A questo punto, ci sono dei modi per ripristinare uno stato stabile piuttosto che terminare il processo?

Esistono architetture di processori (specialmente per sistemi Embedded), con alcune funzionalità extra per gestire questi problemi?

Ci sono anche documenti di ricerca che cercano di capire quali sono gli indirizzi di ritorno validi per una funzione? Ad esempio, se la mia funzione sta tentando di tornare a un indirizzo che è (virtualmente) non valido per il mio programma di fare il suo lavoro, ci sono stati degli sforzi per rilevare tale violazione? O sul livello di programmazione o sul sistema operativo e gestione della memoria?

Nota: Istruzioni illegali è un'eccezione generata dal processore.

Aggiorna

Il salvataggio dell'ultimo puntatore di istruzioni valido noto potrebbe contribuire in qualche modo manualmente? Forse in un registro inutilizzato o riservato, ma dovrebbe essere in qualche modo garantito di non essere toccato dal resto del programma.

    
posta 53777A 06.01.2015 - 12:10
fonte

2 risposte

5

Quando il processore genera un errore di istruzione illegale, di solito ci sono così tante incognite sullo stato del programma che il modo più semplice per entrare in uno stato noto è quello di far arrestare il processo e lasciare riavviare i meccanismi di sicurezza la cosa o lasciare che un sistema di ripiego prenda il sopravvento. Questo potrebbe andare fino al riavvio del dispositivo incorporato.

Tutti i processori che conosco di errori di segnale come istruzioni illegali tramite interrupt. Ecco come un sistema operativo come Windows può informare l'utente che un'applicazione ha fatto qualcosa di terribilmente sbagliato. Nel firmware dei dispositivi incorporati, il controllo del sistema operativo è sufficiente per collegare un gestore diverso a tale interrupt. Questo gestore alternativo potrebbe provare a recuperare la situazione, ma nella mia esperienza, l'unico recupero utilizzato nella pratica è "terminare e riavviare".

    
risposta data 06.01.2015 - 12:46
fonte
1

Su sistemi embedded, in cui non è sempre possibile uscire dal processo e lasciare che il SO pulisca (e se non ci fosse il SO?), un metodo alternativo è quello di passare a un reinit() handler che reinizializza la RAM e salta a il punto di ingresso del programma.

Questa è una tecnica ragionevole se la CPU non ha bisogno di reinizializzazione complessa dopo un tale errore. Ma probabilmente dovresti avere una tecnica di fallback per resettare la CPU effettiva se la semplice reinit() fallisce. A volte può essere necessario un riavvio completamente pulito.

    
risposta data 06.01.2015 - 16:26
fonte

Leggi altre domande sui tag