OSDev

для всех
Текущее время: 27 апр 2024, 14:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 16:58 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Есть идея. Нужен совет стоит или нет. Пришло прерывание определиле железку которая послола прерывание доюавляем прерывание в очередь. Затем посылаем EOI и выходим из прерывания но не назад в задачу, а в обработчик прерываний который и будет выполнять прерывание. Тем самым мы освобождаем irq для других прерываний плюс боремся со штормом прерываний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 17:35 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Естественно, стоит. Без отложенной обработки прерываний не обходится ни одна нормальная ОС.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 18:20 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
А точнее, когда происходит прерывание, управление получает драйвер устройства (точней, входящий в его состав первичный обработчик), а уже он, если есть нужда, откладывает обработку прерывания. Ведь сразу разрешать прерывания от устройства может быть недопустимо; кроме того, не каждое прерывание непременно требует отложенной обработки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 18:33 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Это не совсем отложенная обработка, но накладные расходы будут и возможно сопоставимые.
Просто обработка со включенными других прерываниями и в определённом контексте.
EOI не снимает прерывание с устройства, оно снимает прерывание с контроллера прерывания.


Последний раз редактировалось pavia 18 июн 2012, 18:36, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 18:35 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
не каждое прерывание непременно требует отложенной обработки.
Ясно что не каждое требует, но каждое ли позволяет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 18:41 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Просто идея размаскировать прерывания. Тем самым я смогу предотвратить ситуацию когда баг в обработчике прерывания вешает всю систему.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 19:09 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
pavia писал(а):
Цитата:
не каждое прерывание непременно требует отложенной обработки.
Ясно что не каждое требует, но каждое ли позволяет?
Естественно, прерывание на отложенную обработку ставит первичный обработчик. Соответственно все зависит от того, можно ли в твоей системе повесить несистемный первичный обработчик на любое прерывание или нет.

pavia писал(а):
Просто идея размаскировать прерывания. Тем самым я смогу предотвратить ситуацию когда баг в обработчике прерывания вешает всю систему.
Просто размаскировать прерывания конечно можно, но это криво. Отложенные обработчики не должны прерывать друг друга. А вероятность возникновения ошибки (и подвешивания системы) в первичном обработчике всегда остается, если он плохо написан.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 20:16 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Пишу в псевдокоде.

Код:
proc _Irq1; // заметите с чёрточкой.
сохраняем часть регистров в стеке
устанавливаем ds
сохраняем точку возврата и регистры в ds:[StateInteruptRet]
вызываем AddList(n)  // n номер прерывания
SendEOI;
подменяем точку возврата на IrqProc корректируем вершину стека
iret
end _Irq1;
// больше он ничего не делает

IrqProc
n:=GetFromList()
case  n of
0: ничего не делаем
1:Call IRQ1; // без чёрточки
2:Call IRQ2;
3:Call IRQ3;
4:begin
  таймер;  системный обработчик таймера
  Call IRQ4
  end;
...// и тд.
end;
Загружаем регистры ds:[StateInteruptRet] и возвращаемся в сохраненную точку возврата
end IrqProc;



IRQ1 и IRQ2 и тд. можно подменять. 3-1 Кольцо защиты(3-1 уровень привилегий).
_IRQ1 и _IRQ2 и тд. подменять нельзя. 0 Кольцо защиты(0 уровень привилегий).

IRQ1 к примеру завязан на PCI он должен проверить его ли это прерывания. В вашей терминологии первичный обработчик он и решает вопрос делать прерывание отложенным.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 18 июн 2012, 22:01 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Нет. Ты должен проверять, выполняется ли уже отложенная обработка или нет. В приведенном коде много упущений: риск переполнения стека; риск прерывания отложенного обработчика тем же самым обработчиком; риск разрушения ds:[StateInteruptRet] в IrqProc со стороны _Irq1. В очереди можно сохранять непосредственно адреса отложенных обработчиков. Отложенные обработчики предназначены для режима ядра - они не могут выполняться или обращаться к прикладному пространству, т.к. обычно вызываются в контексте произвольного процесса. Как я уже сказал, отложенные обработчики не должны прерывать друг друга - как минимум сами себя, как максимум себя и любые другие отложенные обработчики. Нужно иметь средство защиты от переполнения очереди, например, наложение отложенных обработчиков одного типа в случае переполнения очереди. Отложенная обработка прерываний может быть не самой приоритетной после работы с запрещенными прерываниями, т.е. прежде чем выполнять отложенную обработку прерываний, нужно еще посмотреть на приоритет кода, который работал до возникновения прерывания. Первичные обработчики можно подменять также, как и отложенные обработчики. Просто есть системные первичные обработчики, которые выполняют всю "скрытую" работу, и не системные, которые вызываются из системных. На одно и то же прерывание может быть повешено несколько не системных первичных обработчиков. Еще и поэтому отложенные обработчики лучше идентифицировать по адресу, а не по номеру прерывания. Ну или ввести уникальную нумерацию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: обработка прерываний
СообщениеДобавлено: 19 июн 2012, 05:31 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
Отложенные обработчики не должны прерывать друг друга.

А почему?
Цитата:
Ты должен проверять, выполняется ли уже отложенная обработка или нет.

Поверку опустил, ровно как и приоритеты.

Цитата:
риск разрушения ds:[StateInteruptRet] в IrqProc со стороны _Irq1
Как ты себе это представляешь? Код ядерный другие приложения не могут его менять.

Цитата:
Отложенные обработчики предназначены для режима ядра - они не могут выполняться или обращаться к прикладному пространству, т.к. обычно вызываются в контексте произвольного процесса
Это понятно. Просто у меня они не в пространстве ядра, а в пространстве драйверов (у него уровень защиты ниже численно больше).

Цитата:
Еще и поэтому отложенные обработчики лучше идентифицировать по адресу, а не по номеру прерывания. Ну или ввести уникальную нумерацию.
Это будет просто код упростил.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 32 ]  На страницу 1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB