Advertisement
jazz_vico

orga2 2doPar1C2018 ej2 fancy

Dec 4th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;15 tareas + 1 tarea "informadora" la tarea 16 el codigo de informador esta en el kernel siendo siempre accecible desde cualquier tarea
  2. ;tss[16]->esp0= pagina_pila_informadora+4096-24
  3. ;tss[16]->esp3= pagina libre en el area libre del mapa de memoria. de esta forma podemos utilizarla con la funcion informar que corre en nivel 3.
  4. ;tss[16]->eflags=0x2 eso deshabilita interrupciones
  5.  
  6. tarea_offset: dd 0x00
  7. tarea_selector: dw 0x00
  8.  
  9. //variables globales:
  10. actual=indice de la tarea actual
  11. reiniciada=indice de la tarea reiniciandose
  12.  
  13. _isr32:
  14.     pushad
  15.  
  16.     call fin_intrpic
  17.     call prox_indice
  18.     mov [tarea_selector],ax
  19.     jmp far [tarea_offset]    
  20.    
  21.     .fin:
  22.     popad
  23.     iret;
  24.  
  25. _int:
  26.     call interrupcion
  27.     push ax
  28.     mov ax,16
  29.     shl ax,3
  30.     mov [tarea_selector], ax
  31.     jmp far tarea_offset
  32.     pop ax
  33.     iret
  34.    
  35.  
  36. void prox_indice(){
  37.     actual=(actual++)%15 +1 <<3;   
  38. }
  39.  
  40. void interrupcion(){
  41.     reiniciada = actual;
  42.     limpiar_memoria(actual);   
  43. }
  44.  
  45. load_cr3:
  46.     mov ax [esp+4]
  47.     mov cr3 ax
  48.     ret
  49.  
  50. dame_baseGDT:  
  51.     str ax
  52.     ret
  53.  
  54.  
  55. _informadora:   ;este codgio tambien le corresponde a la tarea 16 a la int 0x54
  56.     call prox_indice
  57.     mov ax,actual  
  58.     cmp ax , reiniciada
  59.     je.fin
  60.     ;cambio cr3
  61.     push ax
  62.     call cambiar_cr3
  63.     pop ax
  64.     ;reemplazo eip en pila0
  65.     mov [esp] 0x37000000
  66.     ;remplazo cs en pila0  
  67.     or ax 0x11
  68.     mov [esp+4] ax
  69.     ;reemplazo eflags en pila0
  70.     mov [esp+8], 0x2
  71.     ;seteo nuevo esp3 y agrego el valor reiniciada a la pila3
  72.     mov eax [esp+12]
  73.     mov eax [eax-8]
  74.     mov eax [reiniciada]
  75.     ;reemplazo ss en pila0
  76.     mov eax 0x11
  77.     or eax [datos_3]
  78.     mov [esp+16] eax
  79.     iret
  80.     .fin:
  81.     call prox_indice
  82.     mov [tarea_selector], actual
  83.     jmp far [tarea_offset]
  84.     jmp _informadora
  85.    
  86.  
  87. void cambiar_cr3(int tarea){
  88.     int indice=tarea>>3;
  89.     (GDT*) GDTentry = (GDT*) dame_baseGDT();
  90.     (TSS*) punt_tss =GDTentry[indice]->base;
  91.     int cr3=punt_tss->cr3;
  92.     load_cr3(cr3)
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement