OSDev http://osdev.su/ |
|
Работа с прерываниями http://osdev.su/viewtopic.php?f=7&t=366 |
Страница 1 из 3 |
Автор: | s3dworld [ 27 дек 2010, 23:01 ] |
Заголовок сообщения: | Работа с прерываниями |
Всем доброго вечера! Ещё не работал с прерываниями, но уже пора бы. Прерывания нумеруются от 0 до 255 (всего 256 штук). Таблица векторов прерываний должна храниться в регистре IDR. Это всё понятно. Вот сами прерывания: ![]() Решил я сегодня почитать про клавиатуру. И оказалось что она может попросить процессор уделить ей немного времени (причём по приоритету не на последнем месте): ![]() И тут я не понял! Там прерывания, тут прерывания - объясните. Этот нижний список ничем не совпадает с верхним. Какое же тогда прерывание получает процессор от клавиатуры? Что за |
Автор: | SII [ 27 дек 2010, 23:56 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
1. Таблица прерываний хранится не в регистре, а в памяти, в регистре хранится указатель на неё. 2. Клавиатура -- второй по важности источник запросов аппаратных прерываний, а отнюдь не один из последних; важнее её только таймер. 3. С прерываниями на ПК полный бардак, поскольку первый IBM PC (как, впрочем, и последующие модели -- PC/XT, PC/AT) проектировали полные кретины, а в дальнейшем все допущенные ими глупости приходилось повторять для сохранения совместимости. В данном случае эти горе-инженеры, создавая БИОС, инициализировали в нём контроллер прерываний таким образом, что векторы аппаратных прерываний (физические линии запросов прерываний IRQ0--IRQ15; они не имеют никакого отношения к программным прерываниям, поскольку поступают не на процессор, а на контроллер прерываний) совпадали с векторами программных прерываний, часть которых уже тогда была зарезервирована фирмой Интел. Поэтому одним из первейших дел любой сколько-нибудь вменяемой ОС является перепрограммирование контроллера прерываний, чтобы используемые им вектора не совпадали с зарезервированными (0-31). В общем, читайте описание программируемого контроллера прерываний (PIC). Я таковое давно уже сделал на осдевовской вике, но, вообще говоря, описаний разной степени вменяемости полно. |
Автор: | phantom-84 [ 28 дек 2010, 12:20 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
Цитата: И тут я не понял! Там прерывания, тут прерывания - объясните. Этот нижний список ничем не совпадает с верхним. Какое же тогда прерывание получает процессор от клавиатуры? Что за Читаем книжки, в них все написано.
|
Автор: | Yoda [ 21 мар 2011, 19:56 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
Хочу на несколько разных прерываний натравить ОДИН обработчик типа "task gate". Может ли задача-обработчик прерываний определить, какое именно прерывание вызвало переключение задачи? |
Автор: | phantom-84 [ 21 мар 2011, 23:33 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
Может, но лучше для каждого прерывания сделать специфичный вводный код. Например: Код: push ID
jmp common_handler |
Автор: | Yoda [ 22 мар 2011, 00:13 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
А КАК это можно сделать? Лучше или хуже, – это уже вопрос философский. Правда, если накладные расходы на определение очень велики, то из философского он, конечно, перейдёт в практическую сферу. |
Автор: | phantom-84 [ 22 мар 2011, 01:45 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
Это зависит от используемого контроллера прерываний (PIC/APIC). Например, в логике PIC есть регистр ISR, который хранит двоичный набор, определяющий, какие прерывания обрабатываются в данный момент. |
Автор: | SII [ 22 мар 2011, 11:29 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
А обработчики-задачи лучше вообще не использовать. Больше геморроя, да и в64-разрядной системе аппаратной многозадачности уже нет. |
Автор: | phantom-84 [ 22 мар 2011, 18:28 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
Согласен, для прерываний этого делать не нужно (может, только для NMI). Но для некоторых исключений на IA32 альтернативы этому нету. |
Автор: | SII [ 22 мар 2011, 18:53 ] |
Заголовок сообщения: | Re: Работа с прерываниями |
Почему ж нету? Обычные шлюзы прерываний и ловушек. Другое дело, что в 32-разрядном режиме без обработчика-задачи невозможна корректная обработка исключения, если оно вызвано кривым стеком системы, поскольку попытка использования кривого стека автоматом вызывает новое исключение. В конечном итоге будет зафиксирована тройная (или двойная? на разных архитектурах по-разному) ошибка и произойдёт аппаратный сброс процессора. Но, если отбросить этот случай, обработчики-задачи не являются необходимыми. Ну а в 64-разрядном режиме, как уже говорил, их в принципе быть не может. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |