示例#1
0
文件: gdt.c 项目: yoones/yOS
/*
 * 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");
}
示例#2
0
文件: gdt.c 项目: oktail/borealos
/*
 * 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");
}
示例#3
0
文件: gdt.c 项目: benierc/minux
/*
 * 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");

}
示例#4
0
文件: gdt.c 项目: oktail/borealos
void init_data_desc(u32 base, u32 limite, struct gdtdesc* desc) {
	init_gdt_desc(base, limite, 0x93, 0x0D, desc);
}
示例#5
0
文件: gdt.c 项目: oktail/borealos
/*
 * '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);
}