Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;15 tareas + 1 tarea "informadora" la tarea 16 el codigo de informador esta en el kernel siendo siempre accecible desde cualquier tarea
- ;tss[16]->esp0= pagina_pila_informadora+4096-24
- ;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.
- ;tss[16]->eflags=0x2 eso deshabilita interrupciones
- tarea_offset: dd 0x00
- tarea_selector: dw 0x00
- //variables globales:
- actual=indice de la tarea actual
- reiniciada=indice de la tarea reiniciandose
- _isr32:
- pushad
- call fin_intrpic
- call prox_indice
- mov [tarea_selector],ax
- jmp far [tarea_offset]
- .fin:
- popad
- iret;
- _int:
- call interrupcion
- push ax
- mov ax,16
- shl ax,3
- mov [tarea_selector], ax
- jmp far tarea_offset
- pop ax
- iret
- void prox_indice(){
- actual=(actual++)%15 +1 <<3;
- }
- void interrupcion(){
- reiniciada = actual;
- limpiar_memoria(actual);
- }
- load_cr3:
- mov ax [esp+4]
- mov cr3 ax
- ret
- dame_baseGDT:
- str ax
- ret
- _informadora: ;este codgio tambien le corresponde a la tarea 16 a la int 0x54
- call prox_indice
- mov ax,actual
- cmp ax , reiniciada
- je.fin
- ;cambio cr3
- push ax
- call cambiar_cr3
- pop ax
- ;reemplazo eip en pila0
- mov [esp] 0x37000000
- ;remplazo cs en pila0
- or ax 0x11
- mov [esp+4] ax
- ;reemplazo eflags en pila0
- mov [esp+8], 0x2
- ;seteo nuevo esp3 y agrego el valor reiniciada a la pila3
- mov eax [esp+12]
- mov eax [eax-8]
- mov eax [reiniciada]
- ;reemplazo ss en pila0
- mov eax 0x11
- or eax [datos_3]
- mov [esp+16] eax
- iret
- .fin:
- call prox_indice
- mov [tarea_selector], actual
- jmp far [tarea_offset]
- jmp _informadora
- void cambiar_cr3(int tarea){
- int indice=tarea>>3;
- (GDT*) GDTentry = (GDT*) dame_baseGDT();
- (TSS*) punt_tss =GDTentry[indice]->base;
- int cr3=punt_tss->cr3;
- load_cr3(cr3);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement