Почему биты смещения в таблице дескрипторов прерываний (IDT) разделены на два поля? - PullRequest
0 голосов
/ 04 октября 2018

Для архитектуры 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_1 и offset_2 разделены?Это для обратной совместимости?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Необычное расположение полей может быть связано с необходимостью поддерживать защищенный режим 386 с повышенной совместимостью с защищенным режимом 80286.Там, где 386 требовались большие поля, в 286. они превратились в неиспользуемое пространство. Это приводит к довольно хаотичному расположению, которое вы сейчас видите,

Это было полезно, так как вначале было принято запускать 286 операционных систем на386 систем.

В Руководстве по написанию операционных систем iAPX 286, которое вы даже видите на рисунке 2.6, в дескрипторе шлюза есть поля, помеченные как «Зарезервировано для iAPX 386, должно быть нулевым»

PS: записи IDTпросто особый случай записи дескриптора.

0 голосов
/ 04 октября 2018

Обратная совместимость с 8086 IVT (таблица векторов прерываний).Они состоят из 16-битного значения ПК и 16-битного значения CS - точно так же, как первые два поля записи IDT.

...