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