Advertisement
jazz_vico

orga2 2doPar1C2018 ej2

Dec 2nd, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;variables globales:
  2. ;actual=indice de a tarea actual
  3. ;reiniciada=indice de la tarea reiniciandose
  4. ;backup_eip= guarda las dirs de eip a restaurar
  5. ;reg_global=cada reg tiene su variable global
  6.  
  7. tarea_offset: dd 0x00
  8. tarea_selector: dw 0x00
  9.  
  10. ;                                                                                  
  11. ;pilas de tarea luego de ser interrumpida por el clk
  12. ;                                                                                  
  13. ; pila de nivel 0                                   pila de nivel 3                
  14. ;  -                                                                      
  15. ;   |---------------|<-- esp                       |               |                    
  16. ;   |    eip        |                              |               |    
  17. ;   |---------------|                              |               |                    
  18. ;   |    eflags     |                   |--------->|---------------|              
  19. ;   |---------------|                   |          |  cosas        |              
  20. ;   |    esp3       |-------------------|          |   de la       |      
  21. ;   |---------------|                              |   tarea       |              
  22. ;   |    ss         |                              |               |          
  23. ;   |---------------|                              |---------------|              
  24. ;+
  25.  
  26. ;una tarea crashea, pasa a ejecutarse la interrupcion. La interrupcion setea la variable global interrumpida con el index de la tarea actual (la crasheada). Luego ejecuta limpiar_memoria. Despues llama a prox_indice y hace un jmp far a la siguiente tarea.
  27. ;La tarea siguiente, se encuentra finalizando la interrupcion de clk (el comportamiento normal del scheduler:ver apunte interrupcion de clk), (justo en la instruccion de abajo del jmp far del clk) cuando no hay una tarea siendo reiniciada, tiene el comportamiento usual de un scheduler, pero si estamos en la situacion de la interrupcion, llama a la función cambiar contexto. Cambiar_contexto hace los siguientes cambios en la pila
  28.  
  29. ;cambiar_contexto
  30. ;
  31. ;   pila nivel 0
  32. ;   |---------------|<--esp
  33. ;   |  0x3700000    |             pila nivel 3                          en 0x3700000 esta la funcion informar.
  34. ;   |---------------|                                                   báicamente, reemplazamos el eip que estaba
  35. ;   |    eip        |             |               |                     por el de la funcion informar, para que al salir
  36. ;   |---------------|      |----->|---------------|                     de la int de clk, al hacer iret, se popee en eip
  37. ;   |   eflags      |      |      |  reiniciada   |                     ejecutando a continuación la función informar.
  38. ;   |---------------|      |      |---------------|                     Ademas en la pila de nivel 3 agregamos en el tope
  39. ;   |   esp3        |------|      |               |                     el indice de la tarea siendo reiniciada que informar
  40. ;   |---------------|             |   cosas       |                     recibe como parametro.
  41. ;   |    ss         |             |   de la       |
  42. ;   |-------------- |             |    tarea      |
  43. ;   |               |             |---------------|
  44. ;+
  45. ;
  46. ;Luego, la funcion informar llama a la syscall finaizar. Finalizar restaura el contexto de la tarea. Las pilas de la siguiente forma:
  47.  
  48. ;restaurar_contexto
  49. ;
  50. ;  
  51. ;   pila nivel 0
  52. ;                                    pila nivel 3
  53. ;   |---------------|<--esp
  54. ;   |   eip_inf     |             |               |
  55. ;   |---------------|             |---------------|
  56. ;   |   eflags      |             |  reiniciada   |
  57. ;   |---------------|      |----->|---------------|
  58. ;   |   esp3        |------|      |               |
  59. ;   |---------------|             |   cosas       |
  60. ;   |    ss         |             |   de la       |
  61. ;   |-------------- |             |    tarea      |
  62. ;   |               |             |---------------|
  63. ;+                       |
  64. ;                        |
  65. ;                        |
  66. ;                        v
  67. ;  
  68. ;   pila nivel 0
  69. ;                                  pila nivel 3
  70. ;   |---------------|<--esp
  71. ;   | backup_eip    |             |               |
  72. ;   |---------------|             |---------------|
  73. ;   |   eflags      |             |  reiniciada   |
  74. ;   |---------------|      |----->|---------------|
  75. ;   |   esp3        |------|      |               |
  76. ;   |---------------|             |   cosas       |
  77. ;   |    ss         |             |   de la       |
  78. ;   |-------------- |             |    tarea      |
  79. ;   |               |             |---------------|
  80.  
  81. ;esquema de interrupcion:                                      
  82. ; tarea--->interrupcion--->prox tarea en informar--->_finalizar--->limpiar--->prox tarea
  83. ;                                          ^              |
  84. ;                                          ----------------                          
  85. ;                                               14 veces                                                                        
  86.  
  87.  
  88. _isr32:
  89.     mov [regs_global], regs ;para cada reg guardamos en una variable global que le corresponde
  90.     call fin_intrpic
  91.     call prox_indice
  92.     mov [tarea_selector],ax
  93.     jmp far [tarea_offset]
  94.  
  95.     cmp reiniciada,0
  96.     je .fin
  97.     ;nunca entra con la tarea reiniciada pues cae de regreso en la interrupcion
  98.     call cambiar_contextos
  99.     and dwors[esp+4], 0xfffffdff ;deshabilita las interrupciones seteando el bit 9 de eflags en 0
  100.    
  101.     .fin:
  102.     mov regs [regs_global]
  103.     iret;
  104.  
  105. _int:
  106.     pushad 
  107.     call interrupcion  
  108.     mov [tarea_selector],ax
  109.     jmp far [tarea_offset]  
  110. ;aca vuelve al dar la vuelta a las tareas
  111.     mov [reiniciada],0
  112.     or dword[esp+4], 0x00000200
  113.     popad
  114.     iret
  115.  
  116.  
  117. _finalizar:
  118.     call int_finalizar
  119.     or dword[esp+4], 0x00000200 ;restaurar eflags
  120.     mov [tarea_selector],ax
  121.     jmp far [tarea_offset]
  122.     mov regs [regs_global]
  123.     iret
  124.  
  125. ;c:
  126. int int_finalizar(){
  127.     restaurar_contexto();  
  128.     prox_indice();
  129.     return actual;
  130. }
  131.  
  132. int interrupcion(){
  133.     reiniciada = actual;
  134.     limpiar_memoria(actual);
  135.     prox_indice()
  136.     return actual;
  137. }
  138.  
  139. void restaurar_contexto(){     
  140.     int* pila0 = (int*)tss->esp;   
  141.     pila0[0] = backup_eip;
  142.     pila0[2] = pila0[2]+8; restaura esp pila3  
  143. }
  144.  
  145. void cambiar_contexto(){
  146.     int* pila0 = (int*)tss->esp;
  147.     int* pila3 = (int*)pila0[2];
  148.     pila3 = pila3-8;
  149.     pila3[0] = reiniciada;
  150.     pila0[2]=pila3;
  151.     modificar_eip_tss(actual, 0x3700000);
  152. }
  153.  
  154. void modificar_eip_tss(int indice, int valor){
  155.     int eip_ant = tss[indice_eip];
  156.     backup_eip = eip_ant;
  157.     tss[indice]->eip=valor;
  158. }
  159.  
  160.  
  161. void prox_indice(){
  162.     actual=(actual++)%15 +1;   
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement