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/