daily pastebin goal
76%
SHARE
TWEET

orga2 2recu2C2018

jazz_vico Dec 10th, 2018 (edited) 90 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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top