Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;variables globales
- ;gdt puntero a base de gdt
- ;idt puntero a base de idt
- ;tss arreglo con puntero a las tss.cada puntero esta indexado en el indice de la tarea
- ;indice_actual indice tarea actual
- ;2.c
- ;esi dir donde comienza el arreglo de tarea llamadora
- ;edi dir donde comienza el arreglo de tarea destino
- ;ecx cant bytes a copiar
- _interTaskCopy:
- pushad
- mov ds datos_0<<3
- push ecx
- push edi
- push esi
- call interTaskCopy
- pop esi
- pop edi
- pop ecx
- mov ds datos_3<<3
- or ds 0x3
- popad
- iret
- cr3Actual:
- mov eax cr3
- and eax, 0xfffff000
- ret
- ; | ret |<-esp
- ; |-----------|
- ; | cantidad |
- ; |-----------|
- ; | destino |
- ; |-----------|
- ; | origen |
- copiar:
- push ebx
- mov ecx [esp+4]
- mov edi [esp+8]
- mov esi [esp+12]
- mov
- xor eax eax
- .ciclo:
- mov edx [esi+eax]
- mov [edi+eax] edx
- lea eax, [eax+4]
- cmp ecx eax
- jne .ciclo
- pop ebx
- ret
- void copiar(uchar* orgien,uchar* destino,int cantidad){
- for(uchar i; i<cantidad; i++){
- *((uchar*) destino+i)= *(origen+i);
- }
- }
- interTaskCopy(origen, virtDest, cantidad){
- cr3_prox = dame_cr3_proxima();
- virtDest=virtDest+0x40000000; logica + 1gb
- int fisica = mmu_damePaginaFisica(cr3_prox, virtDest);
- int cr3 = cr3Actual();
- mmu_mapearPagina(cr3,0x40000000,fisica,1,1);
- origen=origen+0x40000000;
- copiar(orgien,0x40000000, cantidad);
- mmu_desmapearPagina(cr3,0x40000000);
- }
- dame_cr3_proxima(){
- int tarea=proximo_indice();
- return tss[tarea]->cr3;
- }
- void avanzar_indice(){
- indice_actual=proximo_indice()<<3;
- }
- int proximo_indice(){
- return (indice_actual)%2 +1;
- }
- ;3.a
- int* mmu_damePaginaFisica(pde* cr3, int* virtual){
- int offset_pd = virtual>>22;
- int offset_pt = (virtual<<10)>>22;
- (pte*) basePt = (pte*) (cr3+offset_pd)->addr;
- return (int*) (basePt+offset_pt)->addr
- }
- ;3.b
- int dameEIPnivel3(tss* tarea){
- int* pila0 = (int*) tatea->esp
- return pila[8] ;pushad pushea 8 cosas. luego esta la eip.
- }
- ; para poder implementarlo correctamente hay que saber cuanto hay pusheado
- ;despues de lo que pusheó la int, para sumarselo al tope de la pila
- ;3.c
- int primerByte(){
- int cr3 = dame_cr3_proxima()
- proxima_tarea=proxima_tarea();
- (uchar*) proxima_instrucción dameEIPnivel3(tss[proxima_tarea]);
- proxima_instrucción=proxima_instrucción+0x40000000;
- cambiar_cr3(cr3);
- uchar* res = *proxima_instrucción;
- cambiar_cr3(tss[indice_actual]->cr3);
- return res;
- }
- cambiar_cr3:
- mov ax [esp+4]
- mov cr3
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement