为什么中断描述符 table (IDT) 中的偏移位被分成两个字段?

Why are offset bits in the interrupt descriptor table (IDT) separated to two fields?

对于 IA-32 架构,IDT 条目具有以下格式:

struct IDTDescr {
   uint16_t offset_1; // offset bits 0..15
   uint16_t selector; // a code segment selector in GDT or LDT
   uint8_t zero;      // unused, set to 0
   uint8_t type_attr; // type and attributes, see below
   uint16_t offset_2; // offset bits 16..31
};

为什么 offset_1offset_2 分开了?是为了向后兼容吗?

向后兼容 8086 IVT(中断向量 table)条目。它们由一个 16 位 PC 值和一个 16 位 CS 值组成——与 IDT 条目的前两个字段完全相同。

不寻常的字段布局可以追溯到需要保持 386 保护模式向上兼容 80286 保护模式。在 386 需要更大字段的地方,这些字段在 286 上变成了未使用的 space。这导致您现在看到的相当混乱的排列,

这很有用,因为在早期,运行 286 个操作系统在 386 个系统上很常见。

在 iAPX 286 操作系统编写者指南中,您甚至可以在图 2.6 门描述符中看到标记为 "Reserved for iAPX 386 Must be zero"

的字段

PS: IDT条目只是描述符条目的一个特例。