/* * Cette fonction initialise la GDT apres que le kernel soit charge * en memoire. Une GDT est deja operationnelle, mais c'est celle qui * a ete initialisee par le secteur de boot et qui ne correspond * pas forcement a celle que l'on souhaite. */ void init_gdt(void) { /* initialisation des descripteurs de segment */ init_gdt_desc(0x0, 0x0, 0x0, 0x0, &g_gdt_desc[0]); init_gdt_desc(0x0, 0xFFFFF, 0x9B, 0x0D, &g_gdt_desc[1]); /* code */ init_gdt_desc(0x0, 0xFFFFF, 0x93, 0x0D, &g_gdt_desc[2]); /* data */ init_gdt_desc(0x0, 0x0, 0x97, 0x0D, &g_gdt_desc[3]); /* stack */ /* initialisation de la structure pour GDTR */ g_gdtr.limite = GDT_SIZE * 8; g_gdtr.base = GDT_BASE_ADDR; /* recopie de la GDT a son adresse */ memcpy((char *)g_gdtr.base, (char *)g_gdt_desc, g_gdtr.limite); /* chargement du registre GDTR */ asm("lgdtl (g_gdtr)"); /* initialisation des segments */ asm(" movw $0x10, %ax \n \ movw %ax, %ds \n \ movw %ax, %es \n \ movw %ax, %fs \n \ movw %ax, %gs \n \ ljmp $0x08, $next \n \ next: \n"); }
/* * Cette fonction initialise la GDT apres que le kernel soit charge * en memoire. Une GDT est deja operationnelle, mais c'est celle qui * a ete initialisee par le secteur de boot et qui ne correspond * pas forcement a celle que l'on souhaite pour bosokernel. */ void init_gdt(void) { struct gdtdesc code, data, stack; /* initialisation des descripteurs de segment */ init_code_desc(0x0, 0xFFFFF, &code); init_data_desc(0x0, 0xFFFFF, &data); init_gdt_desc(0, 0x10, 0x97, 0x0D, &stack); add_gdt_desc(code); add_gdt_desc(data); add_gdt_desc(stack); /* initialisation de la structure pour GDTR */ kgdtr.limite = GDTSIZE*8; kgdtr.base = GDTBASE; /* recopie de la GDT a son adresse */ memcopy(kgdt, kgdtr.base, kgdtr.limite); /* chargement du registre GDTR */ asm("lgdtl (kgdtr)"); /* initialisation des segments */ asm(" movw $0x10,%ax \n \ movw %ax, %ds \n \ movw %ax, %es \n \ movw %ax, %fs \n \ movw %ax, %gs \n \ movw $0x18,%ax \n \ movw %ax, %ss \n \ movl $0x1FFFF,%esp \n \ nop \n \ nop \n \ ljmp $0x08,$next \n \ next: \n"); }
/* * Cette fonction initialise la GDT apres que le kernel soit charge * en memoire. Une GDT est deja operationnelle, mais c'est celle qui * a ete initialisee par le secteur de boot et qui ne correspond * pas forcement a celle que l'on souhaite. */ void init_gdt(void) { default_tss.debug_flag = 0x00; default_tss.io_map = 0x00; default_tss.esp0 = 0x20000; default_tss.ss0 = 0x18; /* initialisation des descripteurs de segment */ init_gdt_desc(0x0, 0x0, 0x0, 0x0, &kgdt[0]); init_gdt_desc(0x0, 0xFFFFF, 0x9B, 0x0D, &kgdt[1]); /* code */ init_gdt_desc(0x0, 0xFFFFF, 0x93, 0x0D, &kgdt[2]); /* data */ init_gdt_desc(0x0, 0x0, 0x97, 0x0D, &kgdt[3]); /* stack */ init_gdt_desc(0x0, 0xFFFFF, 0xFF, 0x0D, &kgdt[4]); /* ucode */ init_gdt_desc(0x0, 0xFFFFF, 0xF3, 0x0D, &kgdt[5]); /* udata */ init_gdt_desc(0x0, 0x0, 0xF7, 0x0D, &kgdt[6]); /* ustack */ init_gdt_desc((u32) & default_tss, 0x67, 0xE9, 0x00, &kgdt[7]); /* descripteur de tss */ /* initialisation de la structure pour GDTR */ kgdtr.limit = GDTSIZE * 8; kgdtr.base = GDTBASE; /* recopie de la GDT a son adresse */ memcpy((char *) kgdtr.base, (char *) kgdt, kgdtr.limit); /* chargement du registre GDTR */ asm("lgdtl (kgdtr)"); /* initialisation des segments */ asm(" movw $0x10, %ax \n \ movw %ax, %ds \n \ movw %ax, %es \n \ movw %ax, %fs \n \ movw %ax, %gs \n \ ljmp $0x08, $next \n \ next: \n"); }
void init_data_desc(u32 base, u32 limite, struct gdtdesc* desc) { init_gdt_desc(base, limite, 0x93, 0x0D, desc); }
/* * 'init_code_desc' initialise un descripteur de segment de code. * 'init_data_desc' initialise un descripteur de segment de data. * 'desc' est l'adresse lineaire du descripteur a initialiser. */ void init_code_desc(u32 base, u32 limite, struct gdtdesc* desc) { init_gdt_desc(base, limite, 0x9B, 0x0D, desc); }