LINUX.ORG.RU

Инициализация Interrupt Vector Table


0

1

Мучает пара глупых вопросов, на которые почему-то не получается найти ответ в гугле (а читать Ъ-спецификацию под вечер лень). Речь о x86, real mode, начальная загрузка (т.е. то состояние системы, которое получает в свои руки BIOS):

  • Возможна ли ситуация, когда происходит прерывание до того, как BIOS инициализирует IVT (при условии, что BIOS честно пытается её инициализировать как можно скорее [а нужно ли это делать скорее?])?
  • Если да, то что произойдёт в этом случае?
  • Правильно ли я понимаю, что в real mode по умолчанию записи таблицы ищутся начиная c 0x00000000, и этот участок относится именно к RAM (т.е. он не замаплен на какой-то фиксированый укасток EPROM)
  • Если ли критерий, по которому процессор определяет, что определённый обработчик неинициализирован (скажем, запись в таблице равна 0x00000000)? Или, возможно, это контролируется флагом/регистром (речь именно о real mode; в protected mode, как я понимаю, за это отвечает регистр IDTR)?
★★★

  • полагаю (догадываюсь), что при старте системы контроллеры прерываний (8259) не инициализированы и не могут послать IRQ
  • jmp 0x0000:0x0000, со всеми вытекающими
  • именно так, в реальном режиме расположение таблицы прерываний фиксировано
  • такого нет, см. п. 2
intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)

Более того, при старте системы не инициализирована RAM, так что любой вызов любой функции отправит процессор далеко и надолго.

intelfx ★★★★★ ()

А замаплены на BIOS EEPROM ровно два сегмента: 0xF000 и 0xE000, т. е. 128 КиБ с конца адресного пространства.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)

Хз как теперь, раньше EFLAGS после ресета был = 2 (reserved зачем-то всегда стоит), так что прерывания были запрещены, и кроме NMI и явных INT xx нечему было приходить. Даже если IF=1, биос должен сказать CLI, заполнить таблицу, настроить контроллер, сказать STI, погнали дальше.

arturpub ★★ ()
Ответ на: комментарий от intelfx

На самом деле не 2 сегмента, а целиком, но действительно, на конец адресного простанства, до FFFFFFFF.

gadfly ★★ ()

IVT тоже можно двигать, но для совместимости этого никто не делает.

gadfly ★★ ()
Ответ на: комментарий от gadfly

Это в 32-битном адресном пространстве. На адресное пространство DOS маппятся только последние 128 КиБ.

intelfx ★★★★★ ()
Ответ на: комментарий от gadfly

*загуглил*
Хм, не знал, что LIDT можно в реальном режиме использовать.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

А про DOS никто и не говорил. Кроме того, поскольку содержимое селектора копируется в теневой регистр, то, хитро извернувшись, можно адресовать верхнюю память и в real address mode. Т.н. unreal mode.

gadfly ★★ ()
Ответ на: комментарий от gadfly

ТС говорил про ситуацию во время запуска BIOS (то есть, после сброса процессора), а как известно, x86 стартуют в реальном режиме :)
Ну а про хаки с дескрипторным кэшем речи вообще не шло...

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Вот только современные процессоры стартуют именно в unreal mode и с адреса FFFF_FFF0. Но это страшная тайна, так что никому не рассказывай.

gadfly ★★ ()
Ответ на: комментарий от gadfly

Не совсем правда. База теневого регистра CS - 0xFFFF0000, а вот лимит - 0xFFFF. Так что это не unreal mode никоим боком.

См. «Intel® 64 and IA-32 Architectures Software Developer’s Manual», том 3, таблица 9-1 на стр. 294.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Действительно, не совсем он. Почему-то не сказано в каком состоянии оказывается флаг гранулярности, но даже страницами до 4Г не дотягивает.

gadfly ★★ ()
Ответ на: комментарий от gadfly

Ну там же описаны не дескрипторы, а уже декодированные значения, так что всё в байтах.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Жалко, что книга с сорцами BIOS в офисе. Даже интересно стало, как он при таких начальных значениях распаковывается.

gadfly ★★ ()

тебе бы osdev почитать, парниша. Там ответы на все твои вопросы с подробными примерами есть.

anonymous ()
Ответ на: комментарий от gadfly

Там вроде бы контроллер памяти при старте схемно биты выше 20-го отрезал, для совместимости. Поэтому до поры до времени все, что физически выше метра, заворачивалось по модулю. Потом вроде биос эту хрень отключал, замапив себя уже в нормальные адреса, но тут я уже плаваю.

anonymous ()
Ответ на: комментарий от anonymous

ЕМНИП, не все, а только A20, которую изначально завели чуть ли не на контроллер клавиатуры, лишь бы приткнуть.

gadfly ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.