Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62076
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 143
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-20 21:24
个人简介

学习是一种修行

文章分类

全部博文(10)

文章存档

2014年(2)

2013年(8)

我的朋友

分类: LINUX

2013-12-27 16:26:08

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



阅读(2918) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~