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