1

谁能解释一下段描述符和门描述符之间的确切区别?我正在尝试阅读英特尔手册,但无法弄清楚为什么我们需要 Gate 描述符?除了段描述符之外,它还提供什么设施或支持机制?当我们尝试访问段描述符时,我们也可以进行特权级别检查,对吗?此外,我猜 Linux 和 Windows 不使用调用门描述符。还是在我们访问段描述符之前又多了一层保护?我想知道门描述符的确切区别和需要。

4

1 回答 1

2

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

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

呼叫门是另一章。他们居住在LDT/GDT而不是IDT. 它们的 Type 位字段必须设置为1100b并且它们没有baseand limit,而是另一个应该用于代码和offset在该段中的段选择器。调用门的基本功能:is指定...

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

功能列表来自这里

现代操作系统通常不使用调用门,而是存储在 中的陷阱门IDT,因为它们更快。使用or调用这些“陷阱”(使用intorsysenter执行返回)。如果你想使用调用门,你需要/中的门描述符,进入调用门并返回。请注意,指令仅在内核环 (0) 和用户环 (3) 之间转移控制,而调用门没有这些限制。iret/iretdsysexitGDTLDTjump farret farsysentersysexit

于 2013-08-21T06:40:22.547 回答