我一直在尝试阅读更多关于x86架构中不同的gates的内容。如果我理解正确,那么中断和陷阱门分别用于硬件和软件中断处理。然而,调用门可能不再被使用,因为人们更喜欢用SYSENTER和SYSEXIT来代替。
我想知道如何使用任务门(我知道它们用于硬件任务切换)。这到底是什么意思?硬件任务是否指操作系统任务/进程。或者更像是在两个不同的操作系统实例之间切换。(可能在服务器上。)?
顺便说一句,是否会发生某些中断是在用户模式下处理的情况。(我们可以在用户模式下处理除零中断吗?如果可以,那么除以零IDT处理程序条目是否包含来自用户空间的地址?)
谢谢
发布于 2011-07-14 04:52:29
你可能想知道的关于中断和门的一切都在Intel developer manual, volume 3中。简而言之:
发布于 2012-12-23 17:40:09
事件的状态是,只有中断和陷阱门实际上正在使用中,并且现在仍在使用中。理论上,它们都可以用于s/w和h/w事件处理。它们之间唯一的区别是中断门调用自动禁止未来的中断,这在硬件中断处理的某些情况下可能很有用。默认情况下,人们尝试使用陷阱门,因为不必要的中断禁用是一件坏事,因为中断禁用增加了中断处理延迟并增加了中断丢失的概率。Call gates从未实际使用过。这对于系统调用的实现来说是不方便的,也不是最优的。而不是调用门,大多数操作系统使用陷阱门( Linux中为int 0x80,Windows中为int 0x2E )或sysenter/sysexit syscall/sysrt指令。任务门也从未被实际使用过。它不是最佳的,不方便的和有限的功能,如果不是丑陋的话。操作系统通常通过内核模式的任务栈切换来实现自己的任务切换,而不是直接切换。最初,英特尔通过引入TSS (任务状态段)和任务门来提供对多任务的硬件支持。根据该特性,处理器能够响应来自硬件或软件的请求,自动存储一个任务的状态,并恢复另一个任务的状态。Sw请求可以通过使用TSS选择器或任务门选择器作为指令操作数发出call或jmp指令来完成。可以通过在适当的IDT条目中将硬件陷阱到任务门中来完成Hw请求。但正如我已经提到的,没有人真正使用它。取而代之的是,操作系统对所有任务只使用一个TSS (在任何情况下都必须使用TSS,因为在从较低特权段到较高特权段的控制转移期间,CPU交换机堆栈并且它从TSS获取较高特权段的堆栈地址)并手动进行任务切换。
理论上,中断和异常可以在用户模式下处理(环3),但在实践中它是没有用的,操作系统在内核端处理所有此类事件(环0)。原因很简单,中断和异常处理程序必须始终驻留在内存中,并且可以从任何地址空间访问。地址空间的内核部分是共享的,并且在系统中所有任务的所有地址空间中都是相同的,但是地址空间的用户部分连接到特定任务。如果您想在用户模式下处理异常,您将被迫在每个任务切换上重新编写IDT,这将带来显着的性能损失。如果您想以相同的方式处理中断,您将被迫在相同地址上的所有任务之间共享中断处理程序。作为不想要的后果,系统中的任何任务都将能够损坏处理程序。
https://stackoverflow.com/questions/6683276
复制相似问题