【问题标题】:Segment Descriptor vs Gate descriptors段描述符与门描述符
【发布时间】:2013-08-20 18:13:46
【问题描述】:
谁能解释一下Segment之间的确切区别
描述符和门描述符?我正在尝试通过英特尔
手册,但无法弄清楚为什么我们需要 Gate
描述符?除了段描述符之外,它还提供什么设施或支持机制?我们可以在尝试时进行特权级别检查
访问段描述符也对吗?此外,我猜 Linux 和
Windows 不使用调用门描述符。或者是另一种
在我们访问段描述符之前的保护层?我想知道门描述符的确切区别和需要。
【问题讨论】:
标签:
linux-kernel
x86
x86-64
【解决方案1】:
段描述符指定用于寻址的段。段由指令预定义(movsb、scasb)、由指令形式预定义(在实模式下使用,例如bp 寻址基于ss)或被段覆盖前缀时间>。段描述符存储在(G|L)DT。
门描述符通常是 IDT 的问题。我们知道中断门(用于硬件)、陷阱门(用于处理器异常和软件中断)和任务门(用于硬件任务切换)。它们之间的差异很小(中断门在实际完成之前禁止另一个中断),但在 IDT 中它们具有不同的位表示。
呼叫门是另一章。它们位于LDT/GDT 而不是IDT。它们的类型位字段必须设置为1100b,并且它们没有base 和limit,而是应该用于代码的另一个段选择器,以及该段中的offset。
调用门的基本功能:is指定...
- 目标代码段(存储在描述符表中的另一个段描述符的索引)
- 任何过程的入口点,可由具有最低权限级别的代码使用(使用
offset 字段)
- 发生任务切换时要在堆栈之间复制的可选参数的数量(为此目的保留 5 位,因此最大值为 31)
- 堆栈上值的大小(16/32 位)
函数列表来自here。
现代操作系统通常不使用调用门,而是使用存储在IDT 中的陷阱门,因为它们更快。这些“陷阱”使用int 或sysenter 调用(并使用iret/iretd 或sysexit 执行返回)。如果你想使用调用门,你需要GDT/LDT,jump far中的门描述符进入调用门,ret far返回。请注意,sysenter 和 sysexit 指令仅在内核环 (0) 和用户环 (3) 之间转移控制,而调用门没有这些限制。