⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irq.c

📁 一个用于学习的操作系统
💻 C
字号:
/*文件名: irq.c  说明:   初始化中断异常  作者:   marsinfan  日期:   2005/12/07*/#include <fairysky/kernel.h>#include <asm/system.h>#include <fairysky/defs.h>#include <fairysky/param.h>#include <asm/io.h>DESCR_INT idt[0x100];           // IDTstatic IDTR idtr;                      //IDTRvoid do_lidt(IDTR *idtr);extern  unsigned char exc_has_error[0x20];#ifdef WINDOWS_CYGWIN#define DIVIDE_ERROR_INTERRUPT devide_error_interrupt#define DEBUG_INTERRUPT debug_interrupt#define NMI_INTERRUPT nmi_interrupt#define INT3_INTERRUPT int3_interrupt#define OVERFLOW_INTERRUPT overflow_interrupt#define BOUNDS_INTERRUPT bounds_interrupt#define INVALID_OP_INTERRUPT innvalid_opcode_interrupt#define DEVICE_NOT_AVAILABLE_INTERRUPT device_not_available_interrupt#define DOUBLE_INTERRUPT double_fault_interrupt#define COPROCESSOR_SEGMENT_OVERRUN_INTERRUPT coprocessor_segment_overrun_interrupt#define INVALID_TSS_INTERRUPT invalid_tss_interrupt#define SEGMENT_NOT_PRESENT_INTERRUPT segment_not_present_interrupt#define STACK_SEGMENT_INTERRUPT stack_segment_interrupt#define GENERAL_PROTECTION_INTERRUPT general_protection_interrupt#define PAGE_FAULT_INTERRUPT page_fault_interrupt#define ISR_0F_WRAPPER reserved_interrupt#define COPROCESSOR_ERROR_INTERRUPT coprocessor_error_interrupt#define ISR_11_WRAPPER isr_11_wrapper#define ISR_12_WRAPPER isr_12_wrapper#define ISR_13_WRAPPER isr_13_wrapper#define ISR_14_WRAPPER isr_14_wrapper#define ISR_15_WRAPPER isr_15_wrapper#define ISR_16_WRAPPER isr_16_wrapper#define ISR_17_WRAPPER isr_17_wrapper#define ISR_18_WRAPPER isr_18_wrapper#define ISR_19_WRAPPER isr_19_wrapper#define ISR_1A_WRAPPER isr_1A_wrapper#define ISR_1B_WRAPPER isr_1B_wrapper#define ISR_1C_WRAPPER isr_1C_wrapper#define ISR_1D_WRAPPER isr_1D_wrapper#define ISR_1E_WRAPPER isr_1E_wrapper#define ISR_1F_WRAPPER isr_1F_wrapper#define TIMER_INTERRUPT timer_interrupt#define KBD_INTERRUPT kbd_interrupt#define SYSTEM_CALL system_call_entry#else#define DIVIDE_ERROR_INTERRUPT _devide_error_interrupt#define DEBUG_INTERRUPT _debug_interrupt#define NMI_INTERRUPT _nmi_interrupt#define INT3_INTERRUPT _int3_interrupt#define OVERFLOW_INTERRUPT _overflow_interrupt#define BOUNDS_INTERRUPT _bounds_interrupt#define INVALID_OP_INTERRUPT _innvalid_opcode_interrupt#define DEVICE_NOT_AVAILABLE_INTERRUPT _device_not_available_interrupt#define DOUBLE_INTERRUPT _double_fault_interrupt#define COPROCESSOR_SEGMENT_OVERRUN_INTERRUPT _coprocessor_segment_overrun_interrupt#define INVALID_TSS_INTERRUPT _invalid_tss_interrupt#define SEGMENT_NOT_PRESENT_INTERRUPT _segment_not_present_interrupt#define STACK_SEGMENT_INTERRUPT _stack_segment_interrupt#define GENERAL_PROTECTION_INTERRUPT _general_protection_interrupt#define PAGE_FAULT_INTERRUPT _page_fault_interrupt#define ISR_0F_WRAPPER _reserved_interrupt#define COPROCESSOR_ERROR_INTERRUPT _coprocessor_error_interrupt#define ISR_11_WRAPPER _isr_11_wrapper#define ISR_12_WRAPPER _isr_12_wrapper#define ISR_13_WRAPPER _isr_13_wrapper#define ISR_14_WRAPPER _isr_14_wrapper#define ISR_15_WRAPPER _isr_15_wrapper#define ISR_16_WRAPPER _isr_16_wrapper#define ISR_17_WRAPPER _isr_17_wrapper#define ISR_18_WRAPPER _isr_18_wrapper#define ISR_19_WRAPPER _isr_19_wrapper#define ISR_1A_WRAPPER _isr_1A_wrapper#define ISR_1B_WRAPPER _isr_1B_wrapper#define ISR_1C_WRAPPER _isr_1C_wrapper#define ISR_1D_WRAPPER _isr_1D_wrapper#define ISR_1E_WRAPPER _isr_1E_wrapper#define ISR_1F_WRAPPER _isr_1F_wrapper#define TIMER_INTERRUPT _timer_interrupt#define KBD_INTERRUPT _kbd_interrupt#define SYSTEM_CALL _system_call_entry#endif#define interrupt voidinterrupt DIVIDE_ERROR_INTERRUPT();interrupt DEBUG_INTERRUPT();interrupt NMI_INTERRUPT();interrupt INT3_INTERRUPT();interrupt OVERFLOW_INTERRUPT();interrupt BOUNDS_INTERRUPT();interrupt INVALID_OP_INTERRUPT();interrupt DEVICE_NOT_AVAILABLE_INTERRUPT();interrupt DOUBLE_INTERRUPT();interrupt COPROCESSOR_SEGMENT_OVERRUN_INTERRUPT();interrupt INVALID_TSS_INTERRUPT();interrupt SEGMENT_NOT_PRESENT_INTERRUPT();interrupt STACK_SEGMENT_INTERRUPT();interrupt GENERAL_PROTECTION_INTERRUPT();interrupt PAGE_FAULT_INTERRUPT();interrupt ISR_0F_WRAPPER();interrupt COPROCESSOR_ERROR_INTERRUPT();interrupt ISR_11_WRAPPER();interrupt ISR_12_WRAPPER();interrupt ISR_13_WRAPPER();interrupt ISR_14_WRAPPER();interrupt ISR_15_WRAPPER();interrupt ISR_16_WRAPPER();interrupt ISR_17_WRAPPER();interrupt ISR_18_WRAPPER();interrupt ISR_19_WRAPPER();interrupt ISR_1A_WRAPPER();interrupt ISR_1B_WRAPPER();interrupt ISR_1C_WRAPPER();interrupt ISR_1D_WRAPPER();interrupt ISR_1E_WRAPPER();interrupt ISR_1F_WRAPPER();interrupt TIMER_INTERRUPT();interrupt KBD_INTERRUPT();interrupt SYSTEM_CALL();//设置中断描述附void setup_IDT_entry(DESCR_INT *item,                     u16 selector,                     u32 offset,                     u8 access,                     u8 param_cnt){    item->offset_l = offset & 0xFFFF;    item->selector = selector;    item->param_cnt = param_cnt;    item->access = access;    item->offset_h = offset >> 16;}//#define set_trap_gate(index, fun_addr)    \//    setup_IDT_entry(&idt[index], 0x08, (u32) & fun_addr, ACS_INT, 0)#define set_system_gate(index, fun_addr)    \    setup_IDT_entry(&idt[index], 0x08, (u32) & fun_addr, ACS_TRAP | ACS_DPL_3, 0)#define LATCH (1193180 / HZ)//初始化异常、系统调用等中断处理程序void init_irq(void){    set_trap_gate(0x00, DIVIDE_ERROR_INTERRUPT);    set_trap_gate(0x01, DEBUG_INTERRUPT);    set_trap_gate(0x02, NMI_INTERRUPT);    set_system_gate(0x03, INT3_INTERRUPT);    set_system_gate(0x04, OVERFLOW_INTERRUPT);    set_system_gate(0x05, BOUNDS_INTERRUPT);    set_trap_gate(0x06, INVALID_OP_INTERRUPT);    set_trap_gate(0x07, DEVICE_NOT_AVAILABLE_INTERRUPT);    set_trap_gate(0x08, DOUBLE_INTERRUPT);    set_trap_gate(0x09, COPROCESSOR_SEGMENT_OVERRUN_INTERRUPT);    set_trap_gate(0x0A, INVALID_TSS_INTERRUPT);    set_trap_gate(0x0B, SEGMENT_NOT_PRESENT_INTERRUPT);    set_trap_gate(0x0C, STACK_SEGMENT_INTERRUPT);    set_trap_gate(0x0D, GENERAL_PROTECTION_INTERRUPT);    set_trap_gate(0x0E, PAGE_FAULT_INTERRUPT);    set_trap_gate(0x0F, ISR_0F_WRAPPER);    set_trap_gate(0x10, COPROCESSOR_ERROR_INTERRUPT);    set_trap_gate(0x11, ISR_11_WRAPPER);    set_trap_gate(0x12, ISR_12_WRAPPER);    set_trap_gate(0x13, ISR_13_WRAPPER);    set_trap_gate(0x14, ISR_14_WRAPPER);    set_trap_gate(0x15, ISR_15_WRAPPER);    set_trap_gate(0x16, ISR_16_WRAPPER);    set_trap_gate(0x17, ISR_17_WRAPPER);    set_trap_gate(0x18, ISR_18_WRAPPER);    set_trap_gate(0x19, ISR_19_WRAPPER);    set_trap_gate(0x1A, ISR_1A_WRAPPER);    set_trap_gate(0x1B, ISR_1B_WRAPPER);    set_trap_gate(0x1C, ISR_1C_WRAPPER);    set_trap_gate(0x1D, ISR_1D_WRAPPER);    set_trap_gate(0x1E, ISR_1E_WRAPPER);    set_trap_gate(0x1F, ISR_1F_WRAPPER);    set_trap_gate(0x20, TIMER_INTERRUPT);    set_trap_gate(0x21, KBD_INTERRUPT);    set_system_gate(0x80, SYSTEM_CALL);//系统调用入口    idtr.limit = sizeof(idt) - 1;    idtr.base = ((u32) idt);    lidt(&idtr);//设置lidt    outb_p(0x36, 0x43);             /* binary, mode 3, LSB/MSB, ch 0 */    outb_p(LATCH & 0xff, 0x40); /* LSB */    outb(LATCH >> 8, 0x40);     /* MSB *///初始化始终中断频率}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -