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

Для архитектуры 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам