段描述符与门描述符

时间:2013-08-20 18:13:46

标签: linux-kernel x86 x86-64

  

任何人都可以向我解释细分之间的确切区别   描述符和门描述符?我正在尝试通过英特尔   手册,但无法弄清楚为什么我们需要Gate   描述?除了段描述符之外,它提供了哪些设施或支持机制?我们可以在尝试时进行特权级检查   访问段描述符也对吗?而且我猜Linux和   Windows不使用调用门描述符。或者它还有一种   在我们访问段描述符之前的保护层?我想知道门描述符的确切差异和需要。

1 个答案:

答案 0 :(得分:2)

段描述符指定要用于寻址的段。段是由指令(movsbscasb)预定义的,由指令形式预定义(在实模式中使用,例如bp寻址基于ss)或由...覆盖段覆盖前缀。段描述符存储在(G|L)DT

门描述符通常是IDT的问题。我们知道中断门(用于HW),陷阱门(这些用于处理器异常和软件中断)和任务门(用于HW任务切换)。它们之间的差异非常小(中断门禁止另一个中断直到实际完成),但在IDT中它们具有不同的位表示。

呼叫门是另一章。它们位于LDT / GDT而不是IDT。他们的类型位字段必须设置为1100b,并且它们没有baselimit,但是应该用于代码的另一个段选择器,以及offset分割。 call gate的基本功能:是指定...

  1. 目标代码段(存储在描述符表中的另一段描述符的索引)
  2. 具有最小权限级别的代码可以使用的任何过程的入口点(使用offset字段)
  3. 发生任务切换时要在堆栈之间复制的可选参数数量(为此目的保留5位,因此最大值为31)
  4. 堆栈上的值大小(16/32位)
  5. 功能列表来自here

    现代操作系统通常不使用调用门,而是存储在IDT中的陷阱门,因为它们更快。使用intsysenter调用这些“陷阱”(并使用iret/iretdsysexit执行返回)。如果您想使用呼叫门,则需要GDT / LDTjump far中的门描述符进入呼叫门,而ret far返回。请注意,sysentersysexit指令仅在内核环(0)和用户环(3)之间传输控制,而调用门没有这些限制。