void init_idt() { int i; const static int_handler handlers[16] = { divide_error, single_step_exception, nmi, breakpoint_exception, overflow, bounds_check, inval_opcode, copr_not_available, double_fault, copr_seg_overrun, inval_tss, segment_not_present, stack_exception, general_protection, page_fault, copr_error }; for(i = 0; i <= 14; ++i) { init_idt_desc(i, DA_386IGate, handlers[i], PRIVILEGE_KRNL); } init_idt_desc(16, DA_386IGate, handlers[15], PRIVILEGE_KRNL); for(i = 0x20; i < IDTSIZE; ++i) { init_idt_desc(i, DA_386IGate, hwint00, PRIVILEGE_KRNL); } u16* p_idt_limit = (u16*)(&g_idt_ptr[0]); u32* p_idt_base = (u32*)(&g_idt_ptr[2]); *p_idt_limit = IDTSIZE * sizeof(gate) - 1; *p_idt_base = (u32)&g_idt; load_idt(g_idt_ptr); }
void idt_loader::init_idt(void) { int i; // Initialisation des descripteurs systeme par defaut for (i = 0; i < IDTSIZE; i++) init_idt_desc(0x08, (u32) _asm_default_int, INTGATE, &kidt[i]); init_idt_desc(0x08, (u32) _asm_irq_0, INTGATE, &kidt[32]); // horloge init_idt_desc(0x08, (u32) _asm_irq_1, INTGATE, &kidt[33]); // clavier // Initialisation de la structure pour IDTR kidtr.limite = IDTSIZE * 8; kidtr.base = IDTBASE; // Recopie de la IDT a son adresse memcpy((char *) kidtr.base, (char *) kidt, kidtr.limite); // Chargement du registre IDT ext_kidtr = kidtr; asm("lidtl (ext_kidtr)"); }
/* * Cette fonction initialise la IDT apres que le kernel soit charge * en memoire. */ void init_idt(void) { idtdesc desc; int i; /* initialisation des descripteurs systeme */ for(i=0;i<IDTSIZE;i++) { init_idt_desc(default_int, 0x08, INTGATE, &desc); add_idt_desc(desc); } init_idt_desc(k_int0, 0x08, INTGATE, &kidt[0]); init_idt_desc(k_int1, 0x08, INTGATE, &kidt[1]); init_idt_desc(k_int2, 0x08, INTGATE, &kidt[2]); init_idt_desc(k_int3, 0x08, INTGATE, &kidt[3]); init_idt_desc(k_int4, 0x08, INTGATE, &kidt[4]); init_idt_desc(k_int5, 0x08, INTGATE, &kidt[5]); init_idt_desc(k_int6, 0x08, INTGATE, &kidt[6]); init_idt_desc(k_int7, 0x08, INTGATE, &kidt[7]); init_idt_desc(k_int8, 0x08, INTGATE, &kidt[8]); init_idt_desc(k_int9, 0x08, INTGATE, &kidt[9]); init_idt_desc(k_int10, 0x08, INTGATE, &kidt[10]); init_idt_desc(k_int11, 0x08, INTGATE, &kidt[11]); init_idt_desc(k_int12, 0x08, INTGATE, &kidt[12]); init_idt_desc(k_int13, 0x08, INTGATE, &kidt[13]); init_idt_desc(k_int14, 0x08, INTGATE, &kidt[14]); init_idt_desc(k_int15, 0x08, INTGATE, &kidt[15]); init_idt_desc(k_int16, 0x08, INTGATE, &kidt[16]); init_idt_desc(k_int17, 0x08, INTGATE, &kidt[17]); init_idt_desc(k_int18, 0x08, INTGATE, &kidt[18]); init_idt_desc(k_irq0, 0x08, INTGATE, &kidt[32]); init_idt_desc(k_irq1, 0x08, INTGATE, &kidt[33]); init_idt_desc(k_irq2, 0x08, INTGATE, &kidt[34]); init_idt_desc(k_irq3, 0x08, INTGATE, &kidt[35]); init_idt_desc(k_irq4, 0x08, INTGATE, &kidt[36]); init_idt_desc(k_irq5, 0x08, INTGATE, &kidt[37]); init_idt_desc(k_irq6, 0x08, INTGATE, &kidt[38]); init_idt_desc(k_irq7, 0x08, INTGATE, &kidt[39]); init_idt_desc(k_irq8, 0x08, INTGATE, &kidt[40]); /* initialisation de la structure pour IDTR */ kidtr.limite = IDTSIZE*8; kidtr.base = IDTBASE; /* recopie de la IDT a son adresse */ memcopy(kidt, kidtr.base, kidtr.limite); /* chargement du registre IDTR */ asm("lidtl (kidtr)"); }
void init_port(void) { init_8259A(); /* all initialize as interrupt gate */ init_idt_desc(INT_VECTOR_DIVIDE, DA_386IGATE, divide_error, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_DEBUG, DA_386IGATE, single_step_exception, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_NMI, DA_386IGATE, nmi, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_BREAKPOINT, DA_386IGATE, breakpoint_exception, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_OVERFLOW, DA_386IGATE, overflow, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_BOUNDS, DA_386IGATE, bounds_check, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_INVAL_OP, DA_386IGATE, inval_opcode, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_COPROC_NOT, DA_386IGATE, copr_not_available, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_DOUBLE_FAULT, DA_386IGATE, double_fault, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_COPROC_SEG, DA_386IGATE, copr_seg_overrun, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_INVAL_TSS, DA_386IGATE, inval_tss, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_SEG_NOT, DA_386IGATE, segment_not_present, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_STACK_FAULT, DA_386IGATE, stack_exception, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_PROTECTION, DA_386IGATE, general_protection, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_PAGE_FAULT, DA_386IGATE, page_fault, PRIVILEGE_KERNAL); init_idt_desc(INT_VECTOR_COPROC_ERR, DA_386IGATE, copr_error, PRIVILEGE_KERNAL); }
/*======================================================================* init_prot *----------------------------------------------------------------------* * 作用:初始化IDT和8529 *======================================================================*/ PUBLIC void init_prot() { init_8259A(); // 全部初始化成中断门(没有陷阱门) init_idt_desc(INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_OVERFLOW, DA_386IGate, overflow, PRIVILEGE_USER); init_idt_desc(INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_OP, DA_386IGate, inval_opcode, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_TSS, DA_386IGate, inval_tss, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); // Master 8529A产生的中断 init_idt_desc(INT_VECTOR_IRQ0 + 0, DA_386IGate, hwint00, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 1, DA_386IGate, hwint01, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 2, DA_386IGate, hwint02, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 3, DA_386IGate, hwint03, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 4, DA_386IGate, hwint04, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 5, DA_386IGate, hwint05, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 6, DA_386IGate, hwint06, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 7, DA_386IGate, hwint07, PRIVILEGE_KRNL); // Slave 8529A产生的中断 init_idt_desc(INT_VECTOR_IRQ8 + 0, DA_386IGate, hwint08, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 1, DA_386IGate, hwint09, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 2, DA_386IGate, hwint10, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 3, DA_386IGate, hwint11, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 4, DA_386IGate, hwint12, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 5, DA_386IGate, hwint13, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 6, DA_386IGate, hwint14, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 7, DA_386IGate, hwint15, PRIVILEGE_KRNL); }
/*======================================================================* init_prot *----------------------------------------------------------------------* 初始化 IDT *======================================================================*/ PUBLIC void init_prot () { init_8259A (); // 全部初始化成中断门(没有陷阱门) init_idt_desc (INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_USER); init_idt_desc (INT_VECTOR_OVERFLOW, DA_386IGate, overflow, PRIVILEGE_USER); init_idt_desc (INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_INVAL_OP, DA_386IGate, inval_opcode, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_INVAL_TSS, DA_386IGate, inval_tss, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 0, DA_386IGate, hwint00, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 1, DA_386IGate, hwint01, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 2, DA_386IGate, hwint02, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 3, DA_386IGate, hwint03, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 4, DA_386IGate, hwint04, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 5, DA_386IGate, hwint05, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 6, DA_386IGate, hwint06, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ0 + 7, DA_386IGate, hwint07, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 0, DA_386IGate, hwint08, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 1, DA_386IGate, hwint09, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 2, DA_386IGate, hwint10, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 3, DA_386IGate, hwint11, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 4, DA_386IGate, hwint12, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 5, DA_386IGate, hwint13, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 6, DA_386IGate, hwint14, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_IRQ8 + 7, DA_386IGate, hwint15, PRIVILEGE_KRNL); init_idt_desc (INT_VECTOR_SYS_CALL, DA_386IGate, sys_call, PRIVILEGE_USER); /* 填充 GDT 中 TSS 这个描述符 */ memset (&tss, 0, sizeof (tss)); tss.ss0 = SELECTOR_KERNEL_DS; init_descriptor (&gdt[INDEX_TSS], vir2phys (seg2phys (SELECTOR_KERNEL_DS), &tss), sizeof (tss) - 1, DA_386TSS); tss.iobase = sizeof (tss); /* 没有I/O许可位图 */ // 填充 GDT 中进程的 LDT 的描述符 int i; PROCESS *p_proc = proc_table; u16 selector_ldt = INDEX_LDT_FIRST << 3; for (i = 0; i < NR_TASKS; i++) { init_descriptor (&gdt[selector_ldt >> 3], vir2phys (seg2phys (SELECTOR_KERNEL_DS), proc_table[i].ldts), LDT_SIZE * sizeof (DESCRIPTOR) - 1, DA_LDT); p_proc++; selector_ldt += 1 << 3; } }
PUBLIC void init_prot() { init_8259A(); /* 全部初始化为中断门 */ init_idt_desc(INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_OVERFLOW, DA_386IGate, overflow, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_OP, DA_386IGate, invalid_opcode, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_TSS, DA_386IGate, invalid_tss, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); }
PUBLIC void init_prot() { init_8259A(); /* 全部初始化为中断门 */ init_idt_desc(INT_VECTOR_DIVIDE, DA_386IGate, divide_error, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DEBUG, DA_386IGate, single_step_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_NMI, DA_386IGate, nmi, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_BREAKPOINT, DA_386IGate, breakpoint_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_OVERFLOW, DA_386IGate, overflow, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_BOUNDS, DA_386IGate, bounds_check, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_OP, DA_386IGate, invalid_opcode, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_NOT, DA_386IGate, copr_not_available, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_DOUBLE_FAULT, DA_386IGate, double_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_SEG, DA_386IGate, copr_seg_overrun, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_INVAL_TSS, DA_386IGate, invalid_tss, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_SEG_NOT, DA_386IGate, segment_not_present, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_STACK_FAULT, DA_386IGate, stack_exception, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PROTECTION, DA_386IGate, general_protection, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_PAGE_FAULT, DA_386IGate, page_fault, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_COPROC_ERR, DA_386IGate, copr_error, PRIVILEGE_KRNL); /* 初始化8259A的处理程序 */ init_idt_desc(INT_VECTOR_IRQ0 + 0, DA_386IGate, hwint_00, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 1, DA_386IGate, hwint_01, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 2, DA_386IGate, hwint_02, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 3, DA_386IGate, hwint_03, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 4, DA_386IGate, hwint_04, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 5, DA_386IGate, hwint_05, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 6, DA_386IGate, hwint_06, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ0 + 7, DA_386IGate, hwint_07, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 0, DA_386IGate, hwint_08, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 1, DA_386IGate, hwint_09, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 2, DA_386IGate, hwint_10, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 3, DA_386IGate, hwint_11, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 4, DA_386IGate, hwint_12, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 5, DA_386IGate, hwint_13, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 6, DA_386IGate, hwint_14, PRIVILEGE_KRNL); init_idt_desc(INT_VECTOR_IRQ8 + 7, DA_386IGate, hwint_15, PRIVILEGE_KRNL); }