OSDev
http://osdev.su/

Разница между int 10h в BIOS и исключением #16
http://osdev.su/viewtopic.php?f=5&t=695
Страница 3 из 3

Автор:  achesnokov [ 18 фев 2013, 21:44 ]
Заголовок сообщения:  Re: Разница между int 10h в BIOS и исключением #16

Разница между аппаратным и программным вызовом INT в способе поступления в процессор. Аппаратные прерывания поступают в процессор через контроллер прерываний. Контроллер прерываний позволяет осуществлять маппинг номеров прерываний, что и делается всегда. Т.е. аппаратные прерывания нумеруются, начиная с нулевого, но за счет контроллера прерываний, мапятся на другой диапозон номеров обработчиков прерываний.

Что касается конкретно прерывания #MF от математического сопроцессора, то вопрос этот сложный, не позволяющий дать однозначного ответа, поскольку в процессе эволюции обработка этого прерывания менялась. Хорошее описание можно найти по ссылке http://www.openwatcom.org/index.php/Math_error_handling_on_x87.

Автор:  SII [ 18 фев 2013, 22:28 ]
Заголовок сообщения:  Re: Разница между int 10h в BIOS и исключением #16

achesnokov писал(а):
Разница между аппаратным и программным вызовом INT в способе поступления в процессор. Аппаратные прерывания поступают в процессор через контроллер прерываний. Контроллер прерываний позволяет осуществлять маппинг номеров прерываний, что и делается всегда. Т.е. аппаратные прерывания нумеруются, начиная с нулевого, но за счет контроллера прерываний, мапятся на другой диапозон номеров обработчиков прерываний.


Термин "аппаратный" здесь представляется не слишком хорошим. Например, всякие там #PF тоже генерируются аппаратно, а не программно. Так что, ИМХО, эти прерывания надо называть внешними, поскольку их источники логически находятся снаружи процессора.

С точки зрения процессора, есть только два таких внешних источника: один для линии запроса немаскируемого прерывания NMI и другой для линии обычного внешнего прерывания IRQ. Вот на IRQ-то и заведён выход контроллера прерываний, а все внешние устройства выдают свои запросы прерываний (тоже именуемые IRQ, только с номерами: IRQ0, IRQ3 и т.д.) именно контроллеру прерываний. Последний обрабатывает поступившие запросы, выбирает самый приоритетный из числа незамаскированных и, если его приоритет превосходит приоритет текущего обрабатываемого прерывания, выдаёт процессору сигнал IRQ. Процессор, если прерывания не запрещены, выдаёт контроллеру прерываний сигнал подтверждения прерывания, и контроллер прерываний в ответ выдаёт номер вектора прерывания. Отображение номеров запросов прерываний на номера векторов задаётся программно при инициализации контроллера прерываний. Разработчики БИОСа сделали так, что прерывания IRQ0-IRQ7 отображаются на некоторые из зарезервированных векторов (не помню, на какие именно), но нормальные ОС изменяют это отображение, перепрограммируя контроллер прерываний.

Замечу, что описанная выше схема является в общих чертах верной, но достаточно условной. Кроме того, она соответствует однопроцессорной системе, каковыми были все классические ПК. Однако с появлением многопроцессорных (а позже -- многоядерных, которые логически ничем принципиально от многопроцессорных не отличаются, лишь процессоры там выполнены не в виде отдельных микросхем, а как единая микросхема) систем обработка прерываний претерпела определённые изменения. В частности, традиционный контроллер прерываний PIC сохраняется лишь для совместимости со старыми системами, а новые, поддерживающие многопроцессорность, должны использовать APIC (определённая возможность использовать PIC при этом сохраняется, но вряд ли имеет смысл в большинстве случаев).

Автор:  achesnokov [ 18 фев 2013, 22:51 ]
Заголовок сообщения:  Re: Разница между int 10h в BIOS и исключением #16

Цитата:
Термин "аппаратный" здесь представляется не слишком хорошим. Например, всякие там #PF тоже генерируются аппаратно, а не программно. Так что, ИМХО, эти прерывания надо называть внешними, поскольку их источники логически находятся снаружи процессора.


SII спасибо за комментарии. Исчерпывающе. Intel в документации разделяет прерывания и исключения таким образом: внешние прерывания (они же аппаратные), исключения генерируемые процессором типа #PF, #GP и т.д. и программные прерывания. http://dev64.wordpress.com/2012/04/16/interrupts-handling-in-kernel/.

Автор:  SII [ 18 фев 2013, 23:44 ]
Заголовок сообщения:  Re: Разница между int 10h в BIOS и исключением #16

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

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/