【问题标题】:Understand IDTR register?了解 IDTR 寄存器吗?
【发布时间】:2021-08-07 17:04:03
【问题描述】:

我无法理解这张解释英特尔 X86-64 处理器中 IDTR 的图片。

IDT 基地址大小是 64,我完全明白,因为它可以几乎在内存中的任何位置。

但是,为什么 IDT 限制为 16 位?为什么我们需要所有这些位?

每个向量的大小为 16,并且有 256 个向量,所以我需要表示的最大加法是 16*256=4096,可以在 12 位而不是 16 位中完成。

【问题讨论】:

    标签: operating-system x86-64 osdev interrupt-handling


    【解决方案1】:

    首先,请记住,这种机制可以追溯到 32 位 80386,其中lidt 将加载 32 位基础和 16 位限制。

    我认为使用 16 位限制有两个原因,即使 12 位就足够了:

    1. lidt 采用与lgdt 相同格式的基数/限制对(实际上这两条指令记录在the same page in Intel manuals 上)。而lgdt 确实需要一个 16 位的限制,因为全局描述符表可以达到 64 KB,对应于 8K 条目,每个条目 8 字节(同样适用于 32 位机器)。这个数字是明确选择的,因此一个 16 位选择器,对应于 8086 的 16 位段寄存器,可以用作 GDT 的字节索引,在屏蔽掉用于在 LDT/GDT 之间选择的低 3 位之后并指定请求者权限级别。

      对两条指令使用相同的格式可能允许它们在它们之间共享微码,从而略微降低 80386 的成本和复杂性。

    2. 由于最小的可寻址单元是字节,因此节省 4 位是毫无意义的,因为没有简单的方法可以将半字节用于其他内容。我想英特尔可以说限制字段的高 4 位是保留的,并且可能会考虑在以后的 CPU 中将它们用于其他用途(例如,启用新的中断处理功能),但是,他们没有。

    【讨论】:

    • 它早于 386,因为 IDT amd GDT/LDT 起源于 286 。在 286 上,GDTR/LDTR/IDTR 是 6 字节结构。 2 个字节用于限制,4 个字节用于基地址(仅使用基地址的低 24 位,丢弃高 8 位)
    猜你喜欢
    • 2013-01-11
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2016-08-26
    相关资源
    最近更新 更多