Linux kernel 段描述符与门描述符

Linux kernel 段描述符与门描述符,linux-kernel,x86,x86-64,Linux Kernel,X86,X86 64,谁能给我解释一下这两段的确切区别吗 描述符和门描述符?我想通过英特尔公司 手册,但无法弄清楚为什么我们需要大门 描述符?除了段描述符之外,它还提供什么设施或支持机制?我们可以在尝试执行权限级别检查时执行权限级别检查 也可以访问段描述符,对吗?而且我猜Linux和 Windows不使用调用门描述符。还是又多了一个 在我们访问段描述符之前的保护层?我想知道门描述符的精确区别和需求 段描述符指定用于寻址的段。段由指令(movsb,scasb)预定义,由指令形式预定义(在实模式下使用,例如bp寻址基于s

谁能给我解释一下这两段的确切区别吗 描述符和门描述符?我想通过英特尔公司 手册,但无法弄清楚为什么我们需要大门 描述符?除了段描述符之外,它还提供什么设施或支持机制?我们可以在尝试执行权限级别检查时执行权限级别检查 也可以访问段描述符,对吗?而且我猜Linux和 Windows不使用调用门描述符。还是又多了一个 在我们访问段描述符之前的保护层?我想知道门描述符的精确区别和需求


段描述符指定用于寻址的段。段由指令(
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)之间传输控制,而调用门没有这些限制