Что означает вызов прерывания BIOS

У меня есть три основных вопроса, которые относятся только к архитектуре x86, поскольку я являюсь пользователем микрочипа Intel 80386.

Вот основные, которые я знаю: таблица прерываний начинается с адреса 0x0000, поэтому инструкция int 0x01 будет искать адрес 0x0001. Затем процессор увидит адрес, содержащийся в ячейке 0x0001, и ожидает начала обработчика прерывания 0x01 по этому адресу, на который указывает 0x0001.

Итак, мой первый вопрос: как обработчик прерывания указывает свой конец и сообщает процессору, чтобы он вернулся к процессу, который сделал прерывание. Индикатор только NULL или есть специальное значение, указывающее, что обработчик завершен?

Второй вопрос: в MS-DOS аппаратное прерывание 0x19 используется для перезагрузки компьютера. Я хочу знать, где находится обработчик этого прерывания. это в ПЗУ BIOS, поэтому это называется «вызов прерывания BIOS»? пожалуйста, объясните мне термин. кроме того, поскольку прерывание MS-DOS 0x21 включает функции MS-DOS (например, получение и печать символов), оно находится в ОЗУ, а не в BIOS, верно? Значит ли это, что это не прерывание BIOS?

наконец, я хочу знать, загружаю ли я таблицу прерываний с шестнадцатеричными прерываниями 99, что означает, что 0x99 является последним, что произойдет, если пользователь сделает 0x9A (что на единицу больше, чем 0x99)?

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


person user3724492    schedule 05.09.2014    source источник


Ответы (1)


В реальном режиме каждая запись в таблице прерываний имеет длину 4 байта, 2 байта для сегментной части адреса и 2 байта для смещения. Это означает, что адрес обработчика прерывания 0x01 находится по адресу 0x0: 0x0004. Обработчики прерываний обычно возвращают место, где произошло прерывание, выполняя инструкцию IRET. Это выталкивает адрес и значение регистра FLAGS, которые ЦП сохранил в стеке при возникновении прерывания.

Обработчик прерывания 0x19 обычно указывает на место в ПЗУ BIOS, но возможно, что что-то перехватило прерывание и направило его на обработчик в ОЗУ. Прерывание MS-DOS 0x21 обычно указывает на место в ОЗУ, хотя были версии MS-DOS, которые находились в ПЗУ.

В реальном режиме обычно нет ограничений для таблицы прерываний, поэтому присутствуют все 256 возможных записей, вне зависимости от того, загружены ли во все полезные значения или нет. Когда происходит прерывание, ЦП начинает выполнять инструкции с любого адреса, который он найдет в таблице. Обычно это вызывает сбой, если адрес не является местоположением обработчика прерывания.

person Ross Ridge    schedule 05.09.2014
comment
Отличное объяснение. однако указатель обработчика прерывания 0x01 НАЧИНАЕТСЯ с 0x0: 0x0001 и заканчивается на 0x0: 0x0004, верно? Если да, то вы говорите, что если пользователь введет int 0x02, ЦП будет искать по адресу 0x0: 0x0005 (до 0x0: 0x0008) указатель на обработчик прерывания? на самом деле, я хочу знать, поскольку адрес - это значение двойного слова в x86, как вы сказали, по какому адресу мы будем ссылаться на значение двойного слова, начинающееся с местоположения 0x0: 0x0005? Пожалуйста, объясни. - person user3724492; 05.09.2014
comment
Нет, запись для обработчика прерывания 1 имеет длину 4 байта, первый байт - это адрес 0000:0004, второй - по адресу 0000:0005, третий - по адресу 0000:0006, а последний - по адресу 0000:0007. Байты в 0000:0000 - 0000:0003 составляют запись для обработчика прерывания 0. Запись для обработчика прерывания 2 находится в 0000:0x0008 - 0000:0x000B. Четыре байта, составляющие запись в таблице, представляют собой значение двойного слова, которое является адресом обработчика. - person Ross Ridge; 05.09.2014
comment
Большое спасибо, чувак. Я получил все (наконец). Кстати, я пишу это на своей виртуальной машине! - person user3724492; 08.09.2014