linux内核中断门与DPL3 陷阱门的异常解决办法
时间:2012-07-14 09:17:32
小编:动力软件园
阅读:
中断门: 用于硬件中断,DPL为0,不允许用户态直接使用int指令访问,硬件中断免去这一判断,因此可以在用户态响应中断,见set_intr_gate
DPL3 陷阱门: 用于系统调用,DPL为3,允许用户态直接使用int指令访问,这样才能通过int80访问系统调用,只有80号向量属于此门,见 set_system_gate
DPL0陷阱门: 用于CPU异常,不允许用户态直接使用int指令访问,硬件中断免去这一判断,因此可以在用户产生CPU异常,见set_trap_gate
在指令执行过程中控制单元检测是否有中断/异常发生,如果有,等待该条指令执行完成以后,硬件按如下过程执行:
确定 中断向量的编号i。
从IDT表中得到第i个门描述符。(idtr指向IDT)
由第i项中的选择符和gdtr 查到位于GDT中的段描述符,从而得到中断处理程序的基地址,而偏移量位于门描述符中。
做权限检查:比较cs中的CPL和GDT中 段描述符的DPL,确保中断处理程序的特权级不低于调用者。对于programed exception 还需检查CPL与门描述符的DPL,还应确保CPL大于等于门的DPL。Why?因为INT指令允许用户态的进程产生中断信号,其向量值 可以为0到255的任一值,为了避免用户通过INT指令产生非法中断,在初始化的时候,将向量值为80H的门描述符(系统调用使用该门)的DPL设为3, 将其他需要避免访问的门描述符的DPL值设为0,这样在做权限检查的时候就可以检查出来非法的情况。
检查是否发 生了特权级的变化,一般指是否由用户态陷入了内核态。如果是由用户态陷入了内核态,控制单元必须开始使用与新的特权级相关的堆栈a. 读tr寄存器,访问运行进程的tss段。why?因为任何进程从用户态陷入内核态都必须从TSS获得内核堆栈指针。
b. 用与新特权级相关的栈段和栈指针装载ss和esp寄存器。这些值可以在进程的tss段中找到。
c. 在新的栈(内核栈)中保存用户态的ss和esp,这些值指明了用户态相关栈的逻辑地址。
若发生的是故障,用引起异常的指令 地址修改cs和eip寄存器的值,以使得这条指令在异常处理结束后能被再次执行
在栈中保存eflags、cs和eip的内容
如 果异常带有一个硬件出错码,则将它保存在栈中
装载cs和eip寄存器,其值分别是在GDT中找到的段描述符段基址和IDT表中第i 个门的偏移量。这样就得到了中断/异常处理程序第一条指令的逻辑地址。
从中断/异 常返回:
中断/异常处理完后,相应的处理程序会执行一条iret指令,做了如下事情:
1)用保存在 栈中的值装载cs、eip和eflags寄存器。如果一个硬件出错码曾被压入栈中,那么弹出这个硬件出错码
2)检查处理程序的特权级是 否等于cs中最低两位的值(这意味着进程在被中断的时候是运行在内核态还是用户态)。若是内核态,iret终止执行;否则,转入3
中断:
可屏蔽中断:所有有I/O设备请求的中断都是,被屏蔽的中断会一直被CPU 忽略,直到屏蔽位被重置。
不可屏蔽中断:非常危险的事件引起(如硬件失败)。
异常:
处理器产生的(Fault,Trap,Abort)异常
programmed exceptions(软中断):由程序员通过INT或INT3指令触发,通常当做trap处理,用处:实现系统调用。
中断描述符表(IDT):256项,其中的每一项关联一个中断/异常处理过程,有三种类型:
Task Gate Descriptor. Linux未使用该类型的描述符。
Interrupt Gate Descriptor.用于处理中断。
Trap Gate Descriptor. 用于处理异常。
热门阅读
-
crontab bad minute Do you want to retry the same edit
阅读:1916
-
find: 遗漏“-exec”的参数解决办法
阅读:996
-
centos 7 的syslog.conf配置文件位置|etc/syslog.conf修改
阅读:2969
-
kali安装中文输入法
阅读:1162
-
linux命令中 gzip、zip、tar、bzip2的区别
阅读:383