中断门&陷阱门&任务门&任务段

中断门

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返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值