呼叫门,中断门,陷阱门之间的区别?

smw*_*dia 39 cpu x86 operating-system processor interrupt

我正在研究英特尔保护模式.我发现Call Gate,Interrupt Gate,Trap Gate几乎是一样的.事实上,除了Call Gate具有参数计数器的字段,并且这3个门具有不同的类型字段,它们在所有其他字段中是相同的.

至于它们的功能,它们都用于将代码控制转移到某些代码段中的某些过程.

我很想知道,因为这3个门都包含跨权限边界调用所需的信息.为什么我们需要3种呢?不是一个就够好吗?

感谢您的时间和回应.

更新1

相关问题:何时使用中断门或陷阱门?

更新2

今天我想出了这个想法:

不同的目的,不同的门,以及不同的CPU行为细节进行.如IF标志处理.

Mic*_*kis 60

门(呼叫,中断,任务或陷阱)用于跨段传输控制执行.根据目的地类型和使用的指令,权限级别检查会有所不同.

呼叫门使用CALL和JMP指令.调用门将控制权从较低权限代码转移到较高权限代码.门DPL用于确定哪些特权级别可以访问门.呼叫门(或者可能已经)可能逐渐被放弃,转而采用SYSENTER/SYSEXIT机制,这种机制更快.

任务门用于硬件多任务支持.硬件任务切换可以自动发生(CALL/JMP到任务门描述符),或者在NT标志置位时通过中断或IRET发生.它与中断或陷阱门的工作方式相同.据我所知,任务门都没有使用,因为内核通常需要在任务切换时完成额外的工作.

中断和陷阱门以及任务门被称为中断描述符表.它们的工作方式与调用门相同,除了参数传输,从一个权限堆栈到另一个权限堆栈.一个区别是中断门清除EFLAGS中的IF位,而陷阱门则没有.这使它们成为服务硬件中断的理想选择.陷阱广泛用于硬件辅助虚拟化.

有关更多信息,请参阅您感兴趣的处理器上的"英特尔体系结构手册".

更新

回答评论:

将中断与陷阱区分开的原因有很多.一个是范围的差异:中断门指向内核空间(毕竟,它是管理硬件的内核),而陷阱在用户空间中调用.响应硬件事件调用中断处理程序,而响应CPU指令执行陷阱.

对于一个简单(但不切实际)的例子来更好地理解为什么中断和陷阱门以不同的方式处理EFLAGS,考虑一下如果我们在单处理器系统上为硬件事件编写中断处理程序会发生什么,我们无法清除IF位服务一个.当我们忙于服务第一个中断时,第二个中断可能会到达.然后,在IH执行期间,处理器会在某个随机点调用我们的中断处理程序.这可能导致数据损坏,死锁或其他不良魔法.实际上,中断禁用是确保将一系列内核语句视为关键部分的机制之一.

不过,上面的例子假设可屏蔽中断.无论如何,你不想忽视NMI.

今天它在很大程度上也无关紧要.今天,快速和慢速中断处理程序(搜索"快速和慢速处理程序")几乎没有区别,中断处理程序可以嵌套方式执行,SMP处理器强制要求将本地中断禁用与自旋锁相结合,等等.

现在,陷阱门确实用于服务软件中断,异常等.处理器中的页面错误或除零异常可能通过陷阱门来处理.使用陷阱门控制程序执行的最简单示例是INT 3指令,该指令用于在调试器中实现断点.在进行虚拟化时,会发生的事情是虚拟机管理程序在环0中运行,而客户机内核通常在环1中 - 特权代码会因一般异常故障而失败.Witchel和Rosenblum开发了二进制翻译,这基本上是重写指令来模拟它们的效果.发现关键指令并用陷阱替换.然后,当陷阱执行时,控制产生给VMM /管理程序,VMM /管理程序负责模拟环0中的关键指令.

使用硬件辅助虚拟化,陷阱和模拟技术在其使用上受到一定限制(因为它非常昂贵,特别是当它是动态的时),但二进制转换的实践仍然被广泛使用.

有关更多信息,我建议您查看:

  • Linux设备驱动程序,第三版(在线提供)
  • 对于二进制翻译,QEMU是一个很好的开始.
  • 关于陷阱和仿真,请查看软件/硬件技术之间的比较.

希望这可以帮助!


Zar*_*trA 19

建筑与设计

从保护的角度来看,x86架构基于分层环,根据该环,处理器提供的所有执行空间被划分为四个分层保护域,每个都分配有自己的权限级别.此设计假定大多数时间代码将在权限最少的域中执行,有时将请求来自更高权限的安全域的服务,并且此服务将抢占较少特权的活动到堆栈上,然后以这样的方式恢复它对于权限较低的代码,整个抢占将是不可见的.

分层保护域的设计表明控件不能在不同安全域之间任意传递.

门是x86架构的一个特性,用于控制从较少特权的代码段转移到较多特权的代码段,但反之亦然.此外,控制权将通过的权限较低的段中的点可以是任意的,但是在更严格的段中指向要传递控制的位置是严格指定的.仅通过IRET指令允许向后控制传递到较少特权的段.在这方面,英特尔软件开发人员手册声称

较低权限段中的代码模块只能通过称为门的严格控制和受保护的接口访问在较高权限段上运行的模块.尝试访问更高权限的段而不通过保护门并且没有足够的访问权限会导致生成一般保护异常(#GP).

换句话说,门是具有所需访问权限和目标地址的特权域入口点.以这种方式,所有门都是相似的并且用于几乎相同的目的,并且所有门描述符包含DPL字段,处理器用来控制访问权限.但要注意,处理器检查只有在呼叫的来源是软件门的DPL CALL,JMPINT指令,当呼叫的来源是硬件绕过这个检查.

盖茨的类型

尽管所有门都相似,但它们之间存在一些差异,因为最初的英特尔工程师认为不同的门将用于不同的目的.

任务门

任务门只能存储在IDT和GDT中,并由INT指令调用.这是一种非常特殊的门,与其他门明显不同.

最初,英特尔工程师认为他们将通过为任​​务切换提供基于CPU的功能来彻底改变多任务处理.他们引入了TSS(任务状态段),它保存任务的寄存器状态,并可用于硬件任务切换.触发硬件任务切换有两种方法:使用TSS本身和使用任务门.要进行硬件任务切换,您可以使用CALLJMP指令.如果我正确理解,任务门引入的主要原因是能够触发硬件任务切换以响应中断到达,因为硬件任务切换不能由JMPTS 触发器触发.

实际上,没有人使用它或硬件上下文切换.实际上,从性能的角度来看,这个特征并不是最佳的,并且使用起来不方便.例如,考虑到TSS只能存储在GDT中的帐户和GDT的长度不能超过8192,从硬件的角度来看,我们不能有超过8k的任务.

陷阱门

陷阱门只能存储在IDT中并由INT指令调用.它可以被认为是一种基本类型的门.它只是将控制权传递给更具特权的段中的陷阱门描述符中指定的特定地址,仅此而已.陷阱门主动用于不同目的,可能包括:

  • 系统调用实现(例如Linux使用INT 0x80和Windows INT 0x2E用于此目的)
  • 异常处理实现(我们没有任何理由在异常的情况下禁用中断).
  • 在具有APIC的机器上中断处理实现(我们可以更好地控制内核堆栈).

中断门

中断门只能存储在IDT中并由INT指令调用.它与陷阱门相同,但另外中断门调用还通过自动清除EFLAGS寄存器中的IF标志来禁止将来的中断接受.

中断门主动用于中断处理实现,特别是在基于PIC的机器上.原因是需要控制堆栈深度.PIC没有中断源优先级功能.因此默认情况下,PIC仅禁用处理器中已处理的中断.但是另一个中断仍然可以到达中间并抢占中断处理.因此在同一时刻内核堆栈上可以有15个中断处理程序.结果,内核开发人员强制要求显着增加内核堆栈大小,这会导致内存损失或准备好面对零星的内核堆栈溢出.中断门可以保证在同一时间内只有一个处理程序可以在内核堆栈上.

呼叫门

呼叫门可以存储在GDL和LDT中,并通过CALLJMP指令进行调用.与陷阱门类似,但另外可以将多个参数从用户模式任务堆栈传递到内核模式任务堆栈.传递的参数数量在调用门描述符中指定.

呼叫门从未流行过.原因很少:

  • 它们可以被陷阱门(Occam的Razor)取代.
  • 它们不便携.其他处理器没有这样的功能,这意味着在移植操作系统时支持系统调用的调用门是一个负担,因为必须重写这些调用.
  • 由于可以在堆栈之间传递的参数数量有限,因此它们不太灵活.
  • 从性能的角度来看,它们并不是最优的.

在20世纪90年代末,英特尔和AMD推出了系统调用的附加说明:SYSENTER/ SYSEXIT(Intel)和SYSCALL/ SYSRET(AMD).与呼叫门相反,新指令提供了性能优势并且已被采用.

摘要

我不同意Michael Foukarakis.抱歉,除了影响IF标志外,中断和陷阱之间没有任何区别.

  • 理论上,每种类型的门都可以作为指向具有任何级别权限的段的接口.在实践中,在现代操作系统中仅使用中断和陷阱门,在IDT中用于系统调用,中断和异常处理,因此它们全部用作内核入口点.

  • 可以使用INT指令在软件中调用任何类型的门(包括中断,陷阱和任务).唯一可以禁止用户模式代码访问特定门的功能是DPL.例如,当操作系统构建IDT时,无论特定门的类型如何,将使用将用于硬件事件处理的门的内核设置DPL为0并且根据对此门的访问将仅允许来自内核空间(在大多数特权域运行),但是当它为系统调用设置门时,它将DPL设置为3以允许从任何代码访问该门.结果,用户模式任务能够使用DPL = 3的门进行系统调用,但是在尝试调用键盘中断处理程序时会捕获一般保护错误.

  • IDT中的任何类型的门都可以由硬件调用.只有在想要实现某些同步的情况下,人们才会使用中断门来处理此硬件事件.例如,确保内核堆栈溢出是不可能的.例如,我已成功使用陷阱门用于基于APIC的系统上的硬件中断处理.

  • 类似地,IDT中的任何类型的门都可以在软件中调用.使用陷阱门进行系统调用和异常的原因很简单.没有任何理由禁用中断.中断禁用是一件坏事,因为它会增加中断处理延迟并增加中断丢失的可能性.由于这一点,没有人不会在没有任何严重原因的情况下禁用它们.

  • 中断处理程序通常以严格的重入式风格编写.这样,中断处理程序通常不共享数据,并且可以透明地相互抢占.即使我们需要在中断处理程序中相互排除对数据的并发访问,我们也可以通过使用cli和sti指令来保护对共享数据的访问.没有任何理由将整个中断处理程序视为关键部分.没有任何理由使用中断门,除非希望防止基于PIC的系统上可能的内核堆栈溢出.

陷阱门是内核接口的默认解决方案.如果有一些严重的原因,可以使用中断门代替陷阱门.

  • 我正在尽力清理这个问题,因为你在这里得到了一些真正的金牌,因为语法和拼写错误我害怕被忽略了.请坚持下去.这个答案是一流的. (2认同)

Han*_*ant 8

中断门是特殊的,因为IF标志会自动清零.调用门是特殊的,因为它不会通过中断向量激活.任务门是特殊的,因为它会自动保存处理器状态.四个不同的行为,有四个名称是方便的.