コード例 #1
0
ファイル: idtgdt.c プロジェクト: ChunHungLiu/ubuntu230os
void  init_gdtidt()
{
  struct GDT *gdt=(struct GDT *)(0x00270000);
  struct IDT *idt=(struct IDT *)(0x0026f800);
  int i;
  for(i=0;i<8192;i++)
  {
    setgdt(gdt+i,0,0,0);
  }
  setgdt(gdt+1,0xffffffff   ,0x00000000,0x4092);//entry.s main.c data 4GB空间的数据都能访问
  setgdt(gdt+2,0x000fffff   ,0x00000000,0x409a);//entry.S code
  //setgdt(gdt+3,0x000fffff   ,0x00280000,0x409a);  //main.c code  0x7ffff=512kB
  setgdt(gdt+3,0x000fffff   ,0x00000000,0x409a);//entry.S code
  load_gdtr(0xfff,0X00270000);//this is right

  for(i=0;i<256;i++)
  {
    setidt(idt+i,0,0,0);
  }

  for(i=0;i<256;i++)
  {
      //setidt(idt+i,(int)asm_inthandler21,3*8,0x008e);//用printdebug显示之后,证明这一部分是写进去了

  }
  //setidt(idt+0x21,(int)asm_inthandler21-0x280000,3*8,0x008e);//用printdebug显示之后,证明这一部分是写进去了

  load_idtr(0x7ff,0x0026f800);//this is right

  return;

}
コード例 #2
0
ファイル: idtgdt.c プロジェクト: Redoblue/osask-linux
void init_gdtidt(void){
	struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *)0x00270000;
	struct GATE_DESCRIPTOR *idt= (struct GATE_DESCRIPTOR*)0x0026f800;
	int i;

	//gdt initialize
	for(i=0; i<8192; i++){
		set_segmdesc(gdt+i, 0, 0, 0);
	}
	set_segmdesc(gdt+1, 0xffffffff, 0x00000000, 0x4092);
	set_segmdesc(gdt+2, 0x000fffff, 0x00000000, 0x409a);
	set_segmdesc(gdt+3, 0x000fffff, 0x00280000, 0x409a);
	
	load_gdtr(0xfff, 0x00270000);//??or 0xfff?


	//idt initialize
	for(i=0; i<256; i++){
		set_gatedesc(idt+i, 0, 0, 0);
	}

	for(i=0; i<256; i++){
		set_gatedesc(idt+i, (int)asm_inthandler21, 3*8, 0x008e);
	}
	set_gatedesc(idt+0x21, (int)asm_inthandler21-0x280000, 3*8, 0x008e);
	set_gatedesc(idt+0x2c, (int)asm_inthandler2c, 2*8, AR_INTGATE32);

	load_idtr(0x7ff, 0x0026f800);

	return;
}
コード例 #3
0
ファイル: dsctbl.c プロジェクト: POkoroafor/Seer
void init_gdtidt(void)
{
	struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *) ADR_GDT;
	struct GATE_DESCRIPTOR    *idt = (struct GATE_DESCRIPTOR    *) ADR_IDT;
	int i;
	
	/* initialize GDT */
	for (i = 0; i < 8192; i++) {
		set_segmdesc(gdt + i, 0, 0, 0);
	}
	set_segmdesc(gdt + 1, 0xffffffff, 0x00000000, 0x4092); // it represents all the memory that CPU can manage. limit = 4G 
														   // 0x4092   0100 0000 10010010 -> 32-bit mode, system special, read and write, not execute
	set_segmdesc(gdt + 2, 0x0007ffff, 0x00280000, 0x409a); // 512K, from  0x00280000, prepared for bootpack.hrb
														   // 0x409a -> 32-bit mode, system special(ring0), execute and read, not write
	load_gdtr(0xffff, ADR_GDT); // with the help of assembly
	
	/* initialize IDT */
	for (i = 0; i < 256; i++) {
		set_gatedesc(idt + i, 0, 0, 0);
	}
	
	load_idtr(0x7ff, ADR_IDT); // with the help of assembly
	
	/* setting IDT */
	set_gatedesc(idt + 0x21, (int) asm_inthandler21, 2 * 8, AR_INTGATE32);
	set_gatedesc(idt + 0x2c, (int) asm_inthandler2c, 2 * 8, AR_INTGATE32);
	set_gatedesc(idt + 0x27, (int) asm_inthandler27, 2 * 8, AR_INTGATE32);
	
	return;
}
コード例 #4
0
ファイル: dsctbl.c プロジェクト: siutin/self_os
//初始化GDT、IDT
void init_gdtidt(void)
{
	struct SEGMENT_DESCRIPTOR *gdt=(struct SEGMENT_DESCRIPTOR *)0x00270000;
	struct GATE_DESCRIPTOR *idt=(struct GATE_DESCRIPTOR *)0x0026f800;
	int i;
	
	/*GDT的初始化*/
	for(i=0;i<8192;i++){
		set_segmdesc(gdt+i,0,0,0);
	}
	set_segmdesc(gdt+1,0xffffffff,0x00000000,AR_DATA32_RW);
	set_segmdesc(gdt + 2, LIMIT_BOTPAK, ADR_BOTPAK, AR_CODE32_ER);
	load_gdtr(LIMIT_GDT, ADR_GDT);
	
	/*IDT的初始化*/
	for(i=0;i<256;i++){
		set_gatedesc(idt+i,0,0,0);
	}
	load_idtr(LIMIT_IDT, ADR_IDT);
	
	/*IDT的设定*/
	set_gatedesc(idt+0x21,(int)asm_inthandler21,2*8,AR_INTGATE32);
	set_gatedesc(idt + 0x27, (int) asm_inthandler27, 2 * 8, AR_INTGATE32);
	set_gatedesc(idt+0x2c,(int)asm_inthandler2c,2*8,AR_INTGATE32);
	
	return ;
}
コード例 #5
0
ファイル: idtgdt.c プロジェクト: ChunHungLiu/ubuntu230os
void  init_gdtidt()
{
  struct GDT *gdt=(struct GDT *)(0x00270000);
  struct IDT *idt=(struct IDT *)(0x0026f800);
  int i;
  for(i=0;i<8192;i++)
  {
    setgdt(gdt+i,0,0,0);
  }
  setgdt(gdt+1,0xffffffff   ,0x00000000,0x4092);//entry.s main.c data 4GB空间的数据都能访问
  setgdt(gdt+2,0x000fffff   ,0x00000000,0x409a);//entry.S code
  setgdt(gdt+3,0x000fffff   ,0x00280000,0x409a);  //main.c code  0x7ffff=512kB

   load_gdtr(0xfff,0X00270000);//this is right

  for(i=0;i<256;i++)
  {
    setidt(idt+i,0,0,0);
  }

  for(i=0;i<256;i++)
  {
      setidt(idt+i,(int)asm_inthandler21,3*8,0x008e);//用printdebug显示之后,证明这一部分是写进去了

  }
  setidt(idt+0x20,(int)asm_inthandler20-0x280000,3*8,0x008e);//挂载timer interrrupt service 汇编程序
  setidt(idt+0x21,(int)asm_inthandler21-0x280000,3*8,0x008e);//挂载keyboard interrupt service汇编程序
  setidt(idt+0x2c,(int)asm_inthandler2c-0x280000,3*8,0x008e);//挂载mouse   interrupt service汇编程序

 // setidt(idt+0x21,(int)asm_inthandler21,2*8,0x008e);//挂载keyboard interrupt service
 // setidt(idt+0x2c,(int)asm_inthandler2c,2*8,0x008e);//挂载mouse   interrupt serv
  //printdebug(asm_inthandler2c,0);

  load_idtr(0x7ff,0x0026f800);//this is right



  return;

}
コード例 #6
0
ファイル: dsctbl.c プロジェクト: siutin/self_os
//初始化GDT、IDT
void init_gdtidt(void)
{
	struct SEGMENT_DESCRIPTOR *gdt=(struct SEGMENT_DESCRIPTOR *)0x00270000;
	struct GATE_DESCRIPTOR *idt=(struct GATE_DESCRIPTOR *)0x0026f800;
	int i;
	
	/*GDT的初始化*/
	for(i=0;i<8192;i++){
		set_segmdesc(gdt+i,0,0,0);
	}
	set_segmdesc(gdt+1,0xffffffff,0x00000000,0x4092);
	set_segmdesc(gdt+2,0x0007ffff,0x00280000,0x409a);
	load_gdtr(0xffff,0x00270000);
	
	/*IDT的初始化*/
	for(i=0;i<256;i++){
		set_gatedesc(idt+i,0,0,0);
	}
	load_idtr(0x7ff,0x0026800);
	
	return ;
}
コード例 #7
0
ファイル: segment.c プロジェクト: konyavic/os
void init_gdtidt(void)
{
    gdt = (struct SEGMENT_DESCRIPTOR *)memory_allocate(
            (sizeof(struct SEGMENT_DESCRIPTOR) * NUM_GDT));
/*     struct SEGMENT_DESCRIPTOR *gdt = (struct SEGMENT_DESCRIPTOR *)GDT_ADDR; */
/*     struct GATE_DISCRIPTOR *idt = (struct GATE_DISCRIPTOR *) IDT_ADDR; */
    idt = (struct GATE_DISCRIPTOR*)memory_allocate(
            (sizeof(struct GATE_DISCRIPTOR) * NUM_IDT));

    printf(TEXT_MODE_SCREEN_RIGHT, "idt: 0x%x", idt);
    printf(TEXT_MODE_SCREEN_RIGHT, "gdt: 0x%x", gdt);

    if(idt == NULL){
        return;
    }
    int i;

    //init GDT
    for(i = 0; i < NUM_GDT; i++){
        set_segmdesc(gdt + i, 0, 0, 0, 0, 0, 0, 0);
    }
    set_segmdesc(
            gdt + CODE_SEGMENT_NUM, 0xffffffff, 0x00000000, 0, SEG_TYPE_CODE_XRC,
            DESC_TYPE_SEGMENT, PRIVILEGE_LEVEL_OS, PRESENT);

    set_segmdesc(
            gdt + DATA_SEGMENT_NUM, 0xffffffff, 0x00000000, 0, SEG_TYPE_DATE_REW,
            DESC_TYPE_SEGMENT, PRIVILEGE_LEVEL_OS, PRESENT);


/*     load_gdtr(0xffff, (uintptr_t)gdt); */
    load_gdtr(sizeof(struct SEGMENT_DESCRIPTOR)*4, (uintptr_t)gdt);

    //init IDT
    for(int i = 0; i < NUM_IDT; i++){
        set_gatedesc(idt + i, (uintptr_t)io_hlt, 0, 0, 0, 0, 0);
    /*         set_gatedesc( */
/*             idt + 0x20, (uintptr_t)asm_timer_inthandler, 1*8, GATE_TYPE_32BIT_INT, 0, */
/*             PRIVILEGE_LEVEL_OS, PRESENT); */
    }


/*     for(int i = 0; i < 14; i++){ */
/*         set_gatedesc( */
/*             idt + i, (uintptr_t)asm_fault_inthandler2, 1*8, GATE_TYPE_32BIT_INT, 0, */
/*             PRIVILEGE_LEVEL_OS, PRESENT); */
/*     } */
/*     for(int i = 14; i < 20; i++){ */
/*         set_gatedesc( */
/*             idt + i, (uintptr_t)asm_fault_inthandler, 1*8, GATE_TYPE_32BIT_INT, 0, */
/*             PRIVILEGE_LEVEL_OS, PRESENT); */
/*     } */

    set_gatedesc(
            idt + 13, (uintptr_t)asm_fault_inthandler2, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

    set_gatedesc(
            idt + 8, (uintptr_t)asm_fault_inthandler, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

/*     load_idtr(IDT_LIMIT, (uintptr_t)idt); */
    load_idtr(sizeof(struct GATE_DISCRIPTOR) * NUM_IDT, (uintptr_t)idt);

    set_gatedesc(
            idt + 0x20, (uintptr_t)asm_timer_inthandler, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

    set_gatedesc(
            idt + 0x21, (uintptr_t)asm_inthandler21, CODE_SEGMENT_NUM*8,
            GATE_TYPE_32BIT_INT, 0, PRIVILEGE_LEVEL_OS, PRESENT);

    return;
}