📄 idt.c
字号:
#include "hos.h"static idt_selector_t __idt[IDT_ENTRIES];static idtr_t __idtr;void idt_traps_setup(void);void do_divide_error(void);void init_idt(void){ unsigned long idt_base_addr = (unsigned long) __idt; /* setup idt entry */ /* ... */ idt_traps_setup(); __idtr.limit = 8 * IDT_ENTRIES; __idtr.base = idt_base_addr; __asm__ __volatile__ ( "lidt %0" : : "m" (__idtr) );}/* These codes from linux-2.4.20 */#define _set_gate(gate_addr, type, dpl, addr) \do { \ int __d0, __d1; \ __asm__ __volatile__ ( \ "movw %%dx, %%ax \n\t"\ "movw %4, %%dx \n\t" \ "movl %%eax, %0 \n\t" \ "movl %%edx, %1"\ :"=m" (*((long *) (gate_addr))), \ "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) \ :"i" ((short) (0x8000 + (dpl << 13) + (type << 8))), \ "3" ((char *) (addr)), "2" (0x08 << 16)); \} while (0)void set_intr_gate(unsigned int n, void *addr){ _set_gate(__idt + n, 14, 0, addr);}static void set_trap_gate(unsigned int n, void *addr){ _set_gate(__idt + n, 15, 0, addr);}static void set_system_gate(unsigned int n, void *addr){ _set_gate(__idt + n, 15, 3, addr);}/* setting up trap & system call gate */void idt_traps_setup(void){ set_trap_gate(0, ÷_error);/* set_trap_gate(1, &debug); set_trap_gate(2, &nmi); set_system_gate(3, &int3); set_system_gate(4, &overflow); set_system_gate(5, &bounds); set_trap_gate(6, &invalid_op); set_trap_gate(7, &device_not_available); set_trap_gate(8, &double_fault);*/}void do_divide_error(void){ printk("[kernel trap]: divide_error\n"); STOP();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -