Почему биты смещения в таблице дескрипторов прерываний (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.