我刚开始阅读一些内核代码,描述符的组织方式让我感到很困惑。例如,陷阱门描述符,为什么内核将偏移量分成两个并将它们分开放置?为什么我们不能像这样组织描述符:
63 32 31 16 15 0
-------------------------------------------------------------------------------
| offset [31:0] | selector | others |
-------------------------------------------------------------------------------
答案 0 :(得分:1)
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
};
(偏移分为2个独立的16位条目?)
答。因为
x86
架构以这种方式定义了布局。
x86
定义布局以将32位偏移量存储为两个16位条目?答。 最有可能是由于传统布局从原始的8086继承而来。
在8086处理器中,IDT位于内存中从地址0x0000到0x03ff的固定位置,由256个 32位实模式指针实例组成。
实模式指针定义为
......可以简单地表示为:
struct 8086IDTDescr{
uint16_t offset_1; // offset bits 0..15
uint16_t selector; // a code segment selector in GDT or LDT
};
随后偏移量增加到32位(从16位),并定义了其他类型属性来区分中断,陷阱和任务。现在,新定义的条目在新扩展的结构中被分配了更高的位。
段选择器和较低偏移量位继续像以前一样占据其位置。
有几个原因:
重新使用现有的硬件设计逻辑,以便在较新的芯片中处理原来的低32位。
- 醇>
程序员和现有软件已经熟悉
selector
字段。有意义的是不要移动它。通过正确设置type_attr
字段,现有软件可能会继续使用16位偏移。
有关详细信息,请查看Interrupt Descriptor Table。
的详细说明