Пример #1
0
void tss_inicializar() {
  unsigned int i, cr3;
  
  for (i = 0; i < CANT_TANQUES; i++) {
    cr3 = mmu_inicializar_dir_tarea(i); /* CONSULTAR */
    tss_tanques[i].ptl      = 0x0;
    tss_tanques[i].unused0  = 0x0;
    tss_tanques[i].esp0     = mmu_crear_pagina() + PAGE_SIZE;
    tss_tanques[i].ss0      = 0b1011000;
    tss_tanques[i].unused1  = 0x0;
    tss_tanques[i].esp1     = 0x0;
    tss_tanques[i].ss1      = 0x0;
    tss_tanques[i].unused2  = 0x0;
    tss_tanques[i].esp2     = 0x0;
    tss_tanques[i].ss2      = 0x0;
    tss_tanques[i].unused3  = 0x0;
    tss_tanques[i].cr3      = cr3;  /* ??? */
    tss_tanques[i].eip      = 0x8000000;
    tss_tanques[i].eflags   = 0x00000202;
    tss_tanques[i].eax      = 0x0;
    tss_tanques[i].ecx      = 0x0;
    tss_tanques[i].edx      = 0x0;
    tss_tanques[i].ebx      = 0x0;
    tss_tanques[i].esp      = 0x8002000;
    tss_tanques[i].ebp      = 0x8002000;
    tss_tanques[i].esi      = 0x0;
    tss_tanques[i].edi      = 0x0;
    tss_tanques[i].es       = 0b1100011;
    tss_tanques[i].unused4  = 0x0;
    tss_tanques[i].cs       = 0b1010011;  /* desc lvl 3 */
    tss_tanques[i].unused5  = 0x0;
    tss_tanques[i].ss       = 0b1100011;
    tss_tanques[i].unused6  = 0x0;
    tss_tanques[i].ds       = 0b1100011;
    tss_tanques[i].unused7  = 0x0;
    tss_tanques[i].fs       = 0b1100011;
    tss_tanques[i].unused8  = 0x0;
    tss_tanques[i].gs       = 0b1100011;
    tss_tanques[i].unused9  = 0x0;
    tss_tanques[i].ldt      = 0x0;
    tss_tanques[i].unused10 = 0x0;
    tss_tanques[i].dtrap    = 0x0;  /* ??? */
    tss_tanques[i].iomap    = 0xffff;
  }
  
  gdt[GDT_TSS_TAREA_INICIAL].base_31_24 =  (unsigned int) (&tss_inicial) >> 24;
  gdt[GDT_TSS_TAREA_INICIAL].base_23_16 = ((unsigned int) (&tss_inicial) >> 16) & 0xff;
  gdt[GDT_TSS_TAREA_INICIAL].base_0_15  =  (unsigned int) (&tss_inicial)        & 0xffff;
  
  gdt[GDT_TSS_1].base_31_24 =  (unsigned int) (&tss_next_1) >> 24;
  gdt[GDT_TSS_1].base_23_16 = ((unsigned int) (&tss_next_1) >> 16) & 0xff;
  gdt[GDT_TSS_1].base_0_15  =  (unsigned int) (&tss_next_1)        & 0xffff;
  
  gdt[GDT_TSS_2].base_31_24 =  (unsigned int) (&tss_next_2) >> 24;
  gdt[GDT_TSS_2].base_23_16 = ((unsigned int) (&tss_next_2) >> 16) & 0xff;
  gdt[GDT_TSS_2].base_0_15  =  (unsigned int) (&tss_next_2)        & 0xffff;
}
Пример #2
0
//inicializa para las tareas [0..CANT_TAREAS] sus estructuras de paginacion y sus mapeos(cerrado el intervalo pq la task idle tambien cuenta)
void mmu_inicializar_dir_tareas(){
    unsigned int i=0;
    for(i=0;i<CANT_TAREAS+1/*la idle task tambien cuenta y es la novena contando desde 0*/;i++){
        mmu_inicializar_dir_tarea(i); 
    }

//    changePaginationContext((pagedir_entry*)mmu_get_task_pageDirAddress(0));
//    ejercicio 4c testeado sobre la tarea idle
//    unsigned int oldCR3 = changePaginationContext((pagedir_entry*)mmu_get_task_pageDirAddress(8));
//
//    unsigned char _modoEscritura = (0x4 << 4) | (0xF);
//    unsigned char _caracter = 176;//░
//
//    *((unsigned int*)0x66000) = (_modoEscritura << 8) | _caracter;
//    memcpy((void*)VIDEO, (void*)0x66000, 2/*copio 2 bytes*/);
//
//    changePaginationContext((pagedir_entry*)oldCR3);
}