为什么内核描述符以这种方式组织?

时间:2014-10-13 12:14:20

标签: linux-kernel

enter image description here

我刚开始阅读一些内核代码,描述符的组织方式让我感到很困惑。例如,陷阱门描述符,为什么内核将偏移量分成两个并将它们分开放置?为什么我们不能像这样组织描述符:

63                        32 31                      16 15                    0
-------------------------------------------------------------------------------
| offset [31:0]             |     selector             |    others            |
-------------------------------------------------------------------------------

1 个答案:

答案 0 :(得分:1)

Q值。为什么中断描述符的结构如下

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位实模式指针实例组成。

实模式指针定义为

  • 16位段地址和
  • 该段的16位偏移量。

......可以简单地表示为:

struct 8086IDTDescr{
   uint16_t offset_1;   // offset bits 0..15
   uint16_t selector;   // a code segment selector in GDT or LDT
};

随后偏移量增加到32位(从16位),并定义了其他类型属性来区分中断,陷阱和任务。现在,新定义的条目在新扩展的结构中被分配了更高的位。

Interrupts, Traps and Tasks

段选择器较低偏移量位继续像以前一样占据其位置。

问为什么英特尔更愿意扩展传统结构?

  

有几个原因:

     
      
  1. 重新使用现有的硬件设计逻辑,以便在较新的芯片中处理原来的低32位。

  2.   
  3. 程序员和现有软件已经熟悉selector字段。有意义的是不要移动它。通过正确设置type_attr字段,现有软件可能会继续使用16位偏移。

  4.   

有关详细信息,请查看Interrupt Descriptor Table

的详细说明