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; }
//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); }