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; }
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; }
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; }
//初始化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 ; }
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; }
//初始化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 ; }
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; }