Advertisement
jazz_vico

orga2 2recu2C2018

Dec 10th, 2018
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;variables globales
  2. ;gdt puntero a base de gdt
  3. ;idt puntero a base de idt
  4. ;tss arreglo con puntero a las tss.cada puntero esta indexado en el indice de la tarea
  5. ;indice_actual indice tarea actual
  6.  
  7. ;2.c
  8.  
  9. ;esi dir donde comienza el arreglo de tarea llamadora
  10. ;edi dir donde comienza el arreglo de tarea destino
  11. ;ecx cant bytes a copiar
  12. _interTaskCopy:
  13.     pushad
  14.     mov ds datos_0<<3
  15.     push ecx
  16.     push edi
  17.     push esi
  18.     call interTaskCopy
  19.     pop esi
  20.     pop edi
  21.     pop ecx
  22.     mov ds datos_3<<3
  23.     or ds 0x3
  24.     popad
  25.     iret
  26.  
  27. cr3Actual:
  28.     mov eax cr3
  29.     and eax, 0xfffff000
  30.     ret
  31.  
  32.  
  33. ; |   ret     |<-esp
  34. ; |-----------|
  35. ; |  cantidad |
  36. ; |-----------|
  37. ; | destino   |
  38. ; |-----------|
  39. ; |  origen   |
  40.  
  41. copiar:
  42.     push ebx
  43.     mov ecx [esp+4]
  44.     mov edi [esp+8]
  45.     mov esi [esp+12]
  46.     mov
  47.     xor eax eax
  48.     .ciclo:
  49.         mov edx [esi+eax]
  50.         mov [edi+eax] edx
  51.         lea eax, [eax+4]
  52.         cmp ecx eax
  53.         jne .ciclo
  54.     pop ebx
  55.     ret
  56.  
  57. void copiar(uchar* orgien,uchar* destino,int cantidad){
  58.     for(uchar i; i<cantidad; i++){
  59.         *((uchar*) destino+i)= *(origen+i);
  60.     }
  61. }  
  62.  
  63.  
  64. interTaskCopy(origen, virtDest, cantidad){ 
  65.     cr3_prox = dame_cr3_proxima();
  66.     virtDest=virtDest+0x40000000; logica + 1gb
  67.     int fisica = mmu_damePaginaFisica(cr3_prox, virtDest);
  68.     int cr3 = cr3Actual();
  69.     mmu_mapearPagina(cr3,0x40000000,fisica,1,1);
  70.     origen=origen+0x40000000;
  71.     copiar(orgien,0x40000000, cantidad);
  72.     mmu_desmapearPagina(cr3,0x40000000);
  73. }
  74.  
  75. dame_cr3_proxima(){
  76.     int tarea=proximo_indice();
  77.     return tss[tarea]->cr3;
  78. }
  79.  
  80.  
  81. void avanzar_indice(){
  82.     indice_actual=proximo_indice()<<3;  
  83. }
  84.  
  85. int proximo_indice(){
  86.     return (indice_actual)%2 +1;
  87. }
  88.  
  89. ;3.a
  90. int* mmu_damePaginaFisica(pde* cr3, int* virtual){
  91.     int offset_pd = virtual>>22;
  92.     int offset_pt = (virtual<<10)>>22;
  93.     (pte*) basePt = (pte*) (cr3+offset_pd)->addr;
  94.     return (int*) (basePt+offset_pt)->addr
  95. }
  96.  
  97. ;3.b
  98.  
  99. int dameEIPnivel3(tss* tarea){
  100.     int* pila0 = (int*) tatea->esp
  101.     return pila[8] ;pushad pushea 8 cosas. luego esta la eip.
  102. }
  103.  
  104. ; para poder implementarlo correctamente hay que saber cuanto hay pusheado
  105. ;despues de lo que pusheó la int, para sumarselo al tope de la pila
  106.  
  107. ;3.c
  108.  
  109. int primerByte(){
  110.     int cr3 = dame_cr3_proxima()
  111.     proxima_tarea=proxima_tarea();
  112.     (uchar*) proxima_instrucción dameEIPnivel3(tss[proxima_tarea]);
  113.     proxima_instrucción=proxima_instrucción+0x40000000;
  114.     cambiar_cr3(cr3);  
  115.     uchar* res = *proxima_instrucción;
  116.     cambiar_cr3(tss[indice_actual]->cr3);
  117.     return res;
  118. }
  119.  
  120. cambiar_cr3:
  121.     mov ax [esp+4]
  122.     mov cr3
  123.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement