trap_init函数是中断初始化函数,主要调用了set_trap_gate和set_system_gate;而这两函数的原型都是 _set_gate。这个是内联汇编函数。
代码:
#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ ("movw %%dx,%%ax\n\t" \
"movw %0,%%dx\n\t" \
"movl %%eax,%1\n\t" \
"movl %%edx,%2" \
: \
: "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
"o" (*((char *) (gate_addr))), \
"o" (*(4+(char *) (gate_addr))), \
"d" ((char *) (addr)),"a" (0x00080000))
这个宏先将中断函数地址放在数据段寄存器dx中。在通用寄存器ax放
0x00080000;然后将dx寄存器中的值放入ax中,就是addr地址(中断处理函数地址);接着将第0个参数
放入dx中,既:0x8000+(dpl<<13)+(type<<8;最后将dx,ax寄存器的值放入idt描述符中,分别设置类型,权限,中断入口地址。
对应下图第4*8+8是类型设置,4*8+13就是设置DPL(权限)。如dpl是0,type为15,就是0<<13+15<<8+0x8000;前面的4*8+8的4*8来自 "o" (*(4+(char *) (gate_addr)));0x8000是设置p位,表示此描述符在内存中。
"o" (*((char *) (gate_addr))和movl %%eax,%1是设置中断程序入口地址。
注:代码是linux0.11
阅读(3037) | 评论(0) | 转发(0) |