Конфликт нумерации IRQ - PullRequest
3 голосов
/ 28 октября 2009

От: http://software.intel.com/en-us/articles/introduction-to-pc-architecture/

Исключение 10h соответствует «Ошибка с плавающей точкой», но программное прерывание 10h также соответствует прерываниям BIOS «Поддержка видео» (оба в реальном режиме).

Чего мне не хватает?

Ответы [ 4 ]

6 голосов
/ 28 октября 2009

Вы ничего не упускаете.

Процессор 8088 (тот, который использовался в оригинальном IBM PC) определил только исключения 0, 1, 2, 3 и 4.

Таким образом, IBM использовала от 0x8 до 0xF для аппаратных обработчиков прерываний и от 0x10 и выше для подпрограмм BIOS. По какой-то причине IBM проигнорировала тот факт, что Intel очень четко зарезервировала числа от 0x5 до 0x1F для будущих исключений процессора.

С течением времени требовалось больше исключений, и Intel пошла дальше и назначила их. В большинстве случаев устаревшее программное обеспечение не вызывало эти исключения в любом случае, в то время как более новые операционные системы (работающие в защищенном режиме) могли назначать разные номера, чтобы не конфликтовать с исключениями процессора.

Было добавлено много хаков в старое программное обеспечение, чтобы получить возможность использовать новые функции процессора, не нарушая слишком большую совместимость. Хотя я не уверен, я подозреваю, что, возможно, более новые BIOS могли попытаться определить, был ли INT10 вызван программным прерыванием или сопроцессором в их обработчике INT10.

К вашему сведению, из руководства по программированию 386:

Вектор ошибок сопроцессора для прерывания 16. Любая система 80386 с сопроцессором должна использовать вектор прерывания 16 для исключения ошибки сопроцессора. Если система 8086/8088 использует другой вектор для прерывания 8087, оба вектора должны указывать на обработчик исключений ошибки сопроцессора.

3 голосов
/ 28 октября 2009

ОК, посмотрите здесь, на сайте Watcom . Это важная часть, я думаю, хотя старая заметка о 8087 тоже интересна.

Из-за рыночной реальности огромного большинство пользователей ПК все еще используют ПК DOS и требующий IBM PC совместимость, как IBM AT обработанных математических ошибок не было простой. Потому что IBM проигнорировал Рекомендация Intel при проектировании ПК, 286's Math Fault или прерывание 16 конфликтует с видео сервисом BIOS Прерывание 10 ч (16 десятичных). На вершине что существующее программное обеспечение ожидает математика исключения, поступающие через INT 2.

Вместо подключения процессора и FPU ОШИБКИ выводов, использованных IBM AT схема материнской платы для маршрутизации 287 ОШИБКА сигнала каскадного второго 8259A PIC и использовал IRQ 13 для подачи сигнала математические ошибки в процессоре. По умолчанию Обработчик BIOS IRQ 13 (то есть INT 75h вектор - помните, что IRQ 8, первая линия IRQ второго PIC, соответствует вектору прерывания 70h) содержит код для вызова INT 2 для совместимость с существующим программным обеспечением. Программное обеспечение на AT, таким образом, все еще может подключиться вектор НМИ и работать без изменений на ПК или АТ.

Внешняя схема в IBM AT активирует входной контакт BUSY 286 когда 287 подтверждает свой сигнал ОШИБКИ. Это предотвращает выполнение дальнейшего FPU инструкции и требуется избегать проблемы во временном окне после 287 сообщил об ошибке и перед время 286 начинает обрабатывать результирующее прерывание.

2 голосов
/ 28 октября 2009

Ошибка с плавающей запятой - это прерывание процессора, вызванное ошибкой. Это отличается от IRQ.

PIC (программируемый контроллер прерываний) может использоваться для изменения того, какие IRQ будут сопоставлены с каким прерыванием ЦП. Если вы отправите порт ввода-вывода PIC в правильной последовательности (используя инструкцию OUT), вы можете отобразить IRQ таким образом, чтобы он не конфликтовал с прерыванием ЦП из исключения с плавающей запятой.

См. Также этот документ .

РЕДАКТИРОВАТЬ: Но теперь, когда я прочитал ваш вопрос еще раз ... Мы не говорим о IRQ здесь. BIOS Int 10h - это совсем другой зверь ... Это некоторый код, который ваш BIOS реализовал для видео подпрограмм. Если вы пишете ОС и задаетесь вопросом, должны ли вы обрабатывать ошибки с плавающей запятой, вы, вероятно, должны забыть, что это конкретное прерывание BIOS существует. : -)

РЕДАКТИРОВАТЬ 2: Подумайте об этом, вероятно, способ, которым старые DOS-программы обходили это, заключался в резервном копировании записи IVT, размещении собственного обработчика исключений на месте, выполнении операций с плавающей запятой и восстановлении старой записи IVT, они были сделаны с FPU.

0 голосов
/ 30 августа 2010

Простой ответ заключается в том, что int 10h Ошибка с плавающей запятой - исключение защищенного режима, в то время как int 10h Видеосервисы BIOS - это прерывание реального режима.

Счастливый ответ заключается в том, что очистка бита NE в регистре CR0 предотвратит возникновение исключения и позволит использовать его в PM32 в качестве простого прерывания (, например, в 32-разрядном расширителе BIOS защищенного режима ).

...