Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.08 KB | None | 0 0
  1. #include "ec.h"
  2. #include "kalloc.h"
  3. #include "ptab.h"
  4. #include "types.h"
  5. #include "string.h"
  6. #include "bits.h"
  7.  
  8. typedef enum {
  9.     sys_print      = 1,
  10.     sys_sum        = 2,
  11.     sys_break      = 3,
  12.     sys_thr_create = 4,
  13.     sys_thr_yield  = 5,
  14. } Syscall_numbers;
  15.  
  16. void dealloc() {
  17. //vyrobit funkci, ktera bere pocatek a konec führ cyklu
  18.     //for cyklus pro vsechny stranky
  19.     //Ptab::get_mapping(prvni_adresa_stranky), vraci adresu stranky a na poslednich 3 mistech priznaky - vyandovat ffff000 = fyz adresa;
  20.     //ziskali jsme fyzickou adresu stranky, kterou chceme dealokovat
  21.     //Ptab::insert_mapping(virtualni_adresa_odalokovavano, 0, 0)
  22.     //Kalloc::allocator_free_page(Kalloc::fyztovirt(fyzickou_adresu))
  23.  
  24.  
  25. }
  26.  
  27. void Ec::syscall_handler (uint8 a)
  28. {
  29.     // Get access to registers stored during entering the system - see
  30.     // entry_sysenter in entry.S
  31.     Sys_regs * r = current->sys_regs();
  32.     Syscall_numbers number = static_cast<Syscall_numbers> (a);
  33.  
  34.     switch (number) {
  35.         case sys_print: {
  36.             char *data = reinterpret_cast<char*>(r->esi);
  37.             unsigned len = r->edi;
  38.             for (unsigned i = 0; i < len; i++)
  39.                 printf("%c", data[i]);
  40.             break;
  41.         }
  42.         case sys_sum: {
  43.             // Naprosto nepotřebné systémové volání na sečtení dvou čísel
  44.             int first_number = r->esi;
  45.             int second_number = r->edi;
  46.             r->eax = first_number + second_number;
  47.             break;
  48.         }
  49.         case sys_break: {
  50.             //pouzivame void ukazatel a mword, budeme pretypovavat
  51.  
  52.             printf("Lel, volate funkci sys_brk z OS Kubesa ultra HD v2.0 s upgradem.\n");
  53.  
  54.             //pamet v ESI 1. kontrolovat, jestli je NULL, vracim rovnou EAX, break;
  55.             //nefungovalo srovnani s NULL, je to v poradku?
  56.             if (!r->esi) {
  57.                 mword addr = Ec::break_current;
  58.                 r->eax = Ec::break_current;
  59.                 printf("Hehe, casy se meni, ale adresa: %lu nikoli.\n\n",addr);
  60.                 break;
  61.             }
  62.  
  63.             //inicializace adresy z registru ESI
  64.             mword addr = r->esi;
  65.             printf("Address of brk: %lu\n",addr);
  66.  
  67.             //kontrola korektnosti ESI, jestli je ve spravnem rozmezi, break;
  68.             if (!(addr <= 3221225472 && addr >= 1000)) {
  69.                 printf("Uchylaku, sem (addresa: %lu) mi nesahej!\n\n",addr);
  70.                 r->eax = Ec::break_current;
  71.                 break;
  72.             }
  73.  
  74.             //inicializace aktualni adresy
  75.             mword actual_addr = Ec::break_current;
  76.  
  77.             //kontrola rovnosti s ESI, pak nedelat nic, break;
  78.             if (addr == actual_addr) {
  79.                 printf("Tvl, fakt chces alokovat 0 nove pameti? Good luck. Adresa: %lu\n\n",addr);
  80.                 r->eax = Ec::break_current;
  81.                 break;
  82.             }
  83.  
  84.             //alloc or dealloc - adresa ESI je vetsi, nebo mensi, nez posledni break
  85.  
  86.             //alloc
  87.             if (addr > actual_addr) {
  88.  
  89.                 //vynulovat
  90.  
  91.                 //zjistit align_up(addr, page_size) - nejblizsi prazdne stranky
  92.                 mword next = align_up(actual_addr,PAGE_SIZE);
  93.                 //zjistit align_down(addr, page_size) - neblizsi plne stranky
  94.                 mword last = align_up(actual_addr,PAGE_SIZE)-PAGE_SIZE;
  95.                 printf("Next: %lu, last: %lu, PAGE_SIZE: %d\n",next,last,PAGE_SIZE);
  96.  
  97.                 //tohle je celkova velikost nove alokovane pameti
  98.                 mword sum_size = addr - actual_addr;
  99.                 printf("We need %lu of new memory to allocate.\n",sum_size);
  100.                 //tohle je pocet iteraci, pokud je stranka zcela zaplnena, nastavim promennou na 1
  101.                 mword iteration_count = sum_size / PAGE_SIZE;
  102.                 mword is_full = 1;
  103.                 mword control = sum_size % PAGE_SIZE;
  104.                 if (control > 0) {
  105.                     iteration_count++;
  106.                     is_full = 0;
  107.                 }
  108.                 printf("Starting page full space: %lu. Actual page is full: %lu. There will be %lu iterations.\n",control,is_full,iteration_count);
  109.  
  110.                 //for cyklus od prvni stranky, co mam alokovat po posledni, co mam alokovat
  111.                 for (mword i = 0; i < iteration_count; i++) {
  112.                     //nulovani aktualni stranky
  113.                     //zbyva mi vubec kus stranky?
  114.                     if (!is_full && i == 0) {
  115.                         //muzu rozlisit, jestli cely prazdny zbytek stranky, nebo jenom potrebny kus, ale rekneme, ze to vynuluju cele
  116.                         //RIZIKO CHYBY VE VYPOCTU ADRESY
  117.                         mword phys_dirty = Ptab::get_mapping(next-PAGE_SIZE);
  118.                         mword phys = phys_dirty&0xfffff000;
  119.                         //memset(pocatecni_addresa-stary_break_void_ukazatel, cim_to_chceme_vyplnit, velikost_prostoru_co_budeme_vyplnovat)
  120.                         memset(Kalloc::phys2virt(phys+actual_addr-next-PAGE_SIZE),0x0,next-actual_addr);
  121.  
  122.                         continue;
  123.                     } else {
  124.                         //naalokovat stranku - volat Kalloc::allocator.alloc_page(pocet_stranek=1,jakymi hodnotami vyplnit=0)
  125.                         //tato vec vraci void ukazatel - virtualni adresu
  126.                         void * next_page_virt = Kalloc::allocator.alloc_page(1,Kalloc::FILL_0);
  127.                         //okopirovano +- ze ec.cc, misto panic dealokace (ale zbavit se i aktualni stranky)
  128.                         if (!next_page_virt) {
  129.                             //kontrola, zda page neni NULL, pokud je, dealokovat
  130.                             dealloc(); //DODELAT!!!
  131.                             //poznamka ke zbavovani se aktualni stranky, dealloc na predchozi cykly
  132.                             //VRATIT NA ZACATEK!!!
  133.                             printf("Chyba v alokaci stranky.\n");
  134.                             continue;
  135.                         }
  136.                         //pokud se to povedlo, Ptab::insert_mapping(adresa_od_programu_pro_ktery_alokujeme, Kalloc::virttofyz(virtualni_adresa), znaky)
  137.                         if (!Ptab::insert_mapping (next, Kalloc::virt2phys (next_page_virt), Ptab::PRESENT | Ptab::RW | Ptab::USER)) {
  138.                             dealloc(); //DODELAT!!!
  139.                             printf("Chyba v insert mapping.\n");
  140.                             //VRATIT NA ZACATEK!!!
  141.                             //poznamka ke zbavovani se aktualni stranky, dealloc na predchozi cykly
  142.                         }
  143.  
  144.                         next = align_up(next+1,PAGE_SIZE);
  145.                         printf("Jsem tu: %lu\n",next);
  146.  
  147.                     }
  148.  
  149.  
  150.  
  151.                 }
  152.  
  153.                 r->eax = Ec::break_current;
  154.                 Ec::break_current = addr;
  155.  
  156.                 printf("Koncim: %lu\n",r->eax);
  157.             }
  158.  
  159.             //dealloc
  160.             if (addr < actual_addr) {
  161.                 dealloc();
  162.             }
  163.  
  164.  
  165.             break;
  166.         }
  167.         default:
  168.             printf ("unknown syscall %d\n", number);
  169.             break;
  170.     };
  171.  
  172.     ret_user_sysexit();
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement