中断门
1.系统调用
Windows没有使用调用门,但是使用了中断门。
Windows很多3环API最终都要使用0环的代码,是使用中断门实现的这种功能。
注意:老的CPU是用的中断门而最新的CPU是使用的快速调用。
2.调试
在像OD这种调试工具中按F12下的断点就是将BYTE内容变为0xCC指令位int3这是中断门效果。
IDT
IDT全名中断描述符表,同GDT表一样,IDT也是由一系列描述符组成的,每个描述符占8个字节,
需要注意的是,IDT表中第一个元素不是NULL。
windbg查询IDT表基地址和长度:
r idtr //查询IDT表基地址
r idtl //查询IDT表长度
GDT相比IDT而言,GDT存在代码段或数据段和系统段三种类型,而IDT全部是系统段。
中断门与调用门的区别
查表不同
中断门查IDT,调用门查GDT
中断门描述符不带参数
调用门描述符可以带参数
陷阱门
陷阱门与中断门不能传递参数,基本上是一样的。
陷阱门Type域是D111,中断门Type域是D110
陷阱门与中断门的区别
中断门执行时,将IF位清零,但陷阱门不会。
IF位是EFLAGS的第9位,IF为0意味着不在接收可屏蔽中断。
可屏蔽中断:
比如键盘按下按键后CPU能够知道实际上是键盘向CPU发送了一个可屏蔽中断。
可屏蔽中断受IF位影响,如果IF位为0则按按键CPU不会去处理。
不可屏蔽中断:
比如计算机执行的时候突然断电了,断电的时候电源会通过电源管理器向
当前CPU发送一个请求,这个请求不受IF位影响叫不可屏蔽中断,此时不管
IF位为1或者为0,CPU必须立刻马上去处理。
实际上主板上电容可以让CPU在断电后在运行一段时间去做一些清理工作。
TR
寻找TSS任务段
LTR指令将tss描述符加载到TR中
JMP FAR、CALL FAR与LTR指令的区别
LTR指令必须运行在0环,LTR指令只修改TR段寄存器,并不会触发TSS进行全部寄存器值切换。
JMP FAR和CALL FAR可以通过段选择子找到对应的GDT段描述符,当DPL=11可以在3环使用,
切JMP FAR和CALL FAR会触发TSS任务段机制使其切换全部寄存器。
JMP FAR和CALL FAR访问任务段的区别
JMP FAR(不会恢复寄存器):
使用JMP FAR实现任务切换时,TSS结构体中的Link值在任务切换之后为0。
JMP FAR不会对EFLAGS寄存器中NT位修改。
CALL FAR(可以恢复之前寄存器):
使用CALL FAR实现任务切换后,Link值是填充为原来的TSS段选择子。
CALL FAR会对EFLAGS寄存器中的NT位修改为1。
NT位对iret指令产生影响NT位如果位0,iret的值从堆栈中取(中断返回),
如果NT位为1,会找TSS数据结构中的Link进行返回。
JMP FAR CALL FAR执行代码段与任务段区别
JMP FAR代码段后假设0x48是段选择子那么CS=0x48
如果0x48是TSS段描述符那边,首先他会修改TR寄存器,
其次使用TR.Base指向的TSS中104字节的值进行全部寄存器的替换。
使用任务段TSS步骤
1.创建104字节的数据结构填充寄存器内容。
2.准备好TSS段描述符写入到GDT表(TYPE域=10B1)。
3.修改TR寄存器
1)在0环可以使用LTR指令去修改TR寄存器。
2)3环可以通过CALL FAR或者JMP FAR指令来修改。
任务门执行过程
1.INT 0x20
2.查IDT表,找到中断门描述符
3.通过中断门描述符,查GDT表,找到任务段描述符
4.将任务段描述符加载到TR寄存器之后通过TR寄存器指向的104字节
的TSS段将全部寄存器的值进行修改。
5.IRETD返回