【问题标题】:Segment Descriptor vs Gate descriptors段描述符与门描述符
【发布时间】:2013-08-20 18:13:46
【问题描述】:

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

【问题讨论】:

    标签: linux-kernel x86 x86-64


    【解决方案1】:

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

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

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

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

    函数列表来自here

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-05
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2015-01-29
      • 2010-10-27
      相关资源
      最近更新 更多