Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- SOSTITUZIONE INDIRIZZI NELLO STACK
- Quando si parla di sistemi multitasking una delle problematiche
- che sorgono e' legata allo switch delle procedure a seguito di un
- evento gestito dallo scheduler.
- Senza ricorrere all'assembler e' possibile anche in C sostituire
- nello stack l'indirizzo di ritorno da una funzione eseguendo cosi
- parti di programma senza dover eseguire delle chiamate dirette.
- In pratica lo schedulatore se ritiene che e' opportuno cambiare
- il processo non deve far altro che sostituire nello stack il
- valore di ritorno, salvato alla chiamata della funzione di
- scheduler (in genere l'int 8h), con quello salvato in una
- struttura appartenente a un secondo processo.
- In pratica lo scheduler guarda se il processo 1 ha "girato"
- abbastanza.
- Se e' ora di cambiare il processo salva l'indirizzo di ritorno
- preso nello stack in una struttura (process table), legge da una
- seconda struttura l'indirizzo del processo 2 e lo sostituisce con
- il primo.
- Questo truscolino si ripetera quando sara' ora di sospendere il
- processo 2 per attivare quello 1.
- Un esempio di questa sostituzione fatta in C e' nel seguente
- listato.
- La funzione PRINT_ONE come potrete vedere non viene mai chiamata
- direttamente e la sua esecuzione avviene sfruttando la
- metodologia della sostituzione dell'indirizzo di ritorno dalla
- funzione PRINT_TWO.
- L'indirizzo del punto in cui il MAIN ha richiamato la funzione
- PRINT_ONE e' salvato nella stessa funzione e viene rispristinato
- dalla funzione PRINT_TWO.
- In pratica :
- 1) MAIN chiama PRINT_ONE.
- 2) PRINT_ONE in uscita pensa di tornare a MAIN ma di fatto salta
- a PRINT_TWO.
- 3) PRINT_TWO torna al main
- Attenzione a compilare l'esempio in modello SMALL in quanto in
- modello LARGE nello stack c'e' anche CS ecc. ecc.
- unsigned oldaddr;
- void print_one(char addr)
- {
- printf("\nFunzione sostituita");
- (*(((unsigned *) &addr) - 1)) = oldaddr;
- }
- void print_two(char addr)
- {
- oldaddr = (*(((unsigned *) &addr) - 1));
- (*(((unsigned *) &addr) - 1)) = (unsigned) print_one;
- printf("\nFunzione sostituente");
- }
- void main(void)
- {
- print_two();
- printf("\n\nTerminato !\n\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement