Advertisement
JeffClinton

Sostituzione indirizzi ritorno nello stack

May 28th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. SOSTITUZIONE INDIRIZZI NELLO STACK
  2.  
  3. Quando si parla di sistemi multitasking una delle problematiche
  4. che sorgono e' legata allo switch delle procedure a seguito di un
  5. evento gestito dallo scheduler.
  6. Senza ricorrere all'assembler e' possibile anche in C sostituire
  7. nello stack l'indirizzo di ritorno da una funzione eseguendo cosi
  8. parti di programma senza dover eseguire delle chiamate dirette.
  9. In pratica lo schedulatore se ritiene che e' opportuno cambiare
  10. il processo non deve far altro che sostituire nello stack il
  11. valore di ritorno, salvato alla chiamata della funzione di
  12. scheduler (in genere l'int 8h), con quello salvato in una
  13. struttura appartenente a un secondo processo.
  14. In pratica lo scheduler guarda se il processo 1 ha "girato"
  15. abbastanza.
  16. Se e' ora di cambiare il processo salva l'indirizzo di ritorno
  17. preso nello stack in una struttura (process table), legge da una
  18. seconda struttura l'indirizzo del processo 2 e lo sostituisce con
  19. il primo.
  20. Questo truscolino si ripetera quando sara' ora di sospendere il
  21. processo 2 per attivare quello 1.
  22. Un esempio di questa sostituzione fatta in C e' nel seguente
  23. listato.
  24. La funzione PRINT_ONE come potrete vedere non viene mai chiamata
  25. direttamente e la sua esecuzione avviene sfruttando la
  26. metodologia della sostituzione dell'indirizzo di ritorno dalla
  27. funzione PRINT_TWO.
  28. L'indirizzo del punto in cui il MAIN ha richiamato la funzione
  29. PRINT_ONE e' salvato nella stessa funzione e viene rispristinato
  30. dalla funzione PRINT_TWO.
  31. In pratica :
  32.  
  33. 1) MAIN chiama PRINT_ONE.
  34. 2) PRINT_ONE in uscita pensa di tornare a MAIN ma di fatto salta
  35. a PRINT_TWO.
  36. 3) PRINT_TWO torna al main
  37.  
  38. Attenzione a compilare l'esempio in modello SMALL in quanto in
  39. modello LARGE nello stack c'e' anche CS ecc. ecc.
  40.  
  41.  
  42. unsigned oldaddr;
  43.  
  44. void print_one(char addr)
  45. {
  46. printf("\nFunzione sostituita");
  47. (*(((unsigned *) &addr) - 1)) = oldaddr;
  48. }
  49.  
  50. void print_two(char addr)
  51. {
  52. oldaddr = (*(((unsigned *) &addr) - 1));
  53. (*(((unsigned *) &addr) - 1)) = (unsigned) print_one;
  54. printf("\nFunzione sostituente");
  55. }
  56.  
  57.  
  58.  
  59. void main(void)
  60. {
  61. print_two();
  62. printf("\n\nTerminato !\n\n");
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement