OSDev http://osdev.su/ |
|
обработка прерываний http://osdev.su/viewtopic.php?f=6&t=586 |
Страница 1 из 4 |
Автор: | pavia [ 18 июн 2012, 16:58 ] |
Заголовок сообщения: | обработка прерываний |
Есть идея. Нужен совет стоит или нет. Пришло прерывание определиле железку которая послола прерывание доюавляем прерывание в очередь. Затем посылаем EOI и выходим из прерывания но не назад в задачу, а в обработчик прерываний который и будет выполнять прерывание. Тем самым мы освобождаем irq для других прерываний плюс боремся со штормом прерываний. |
Автор: | phantom-84 [ 18 июн 2012, 17:35 ] |
Заголовок сообщения: | Re: обработка прерываний |
Естественно, стоит. Без отложенной обработки прерываний не обходится ни одна нормальная ОС. |
Автор: | SII [ 18 июн 2012, 18:20 ] |
Заголовок сообщения: | Re: обработка прерываний |
А точнее, когда происходит прерывание, управление получает драйвер устройства (точней, входящий в его состав первичный обработчик), а уже он, если есть нужда, откладывает обработку прерывания. Ведь сразу разрешать прерывания от устройства может быть недопустимо; кроме того, не каждое прерывание непременно требует отложенной обработки. |
Автор: | pavia [ 18 июн 2012, 18:33 ] |
Заголовок сообщения: | Re: обработка прерываний |
Это не совсем отложенная обработка, но накладные расходы будут и возможно сопоставимые. Просто обработка со включенными других прерываниями и в определённом контексте. EOI не снимает прерывание с устройства, оно снимает прерывание с контроллера прерывания. |
Автор: | pavia [ 18 июн 2012, 18:35 ] |
Заголовок сообщения: | Re: обработка прерываний |
Цитата: не каждое прерывание непременно требует отложенной обработки. Ясно что не каждое требует, но каждое ли позволяет?
|
Автор: | pavia [ 18 июн 2012, 18:41 ] |
Заголовок сообщения: | Re: обработка прерываний |
Просто идея размаскировать прерывания. Тем самым я смогу предотвратить ситуацию когда баг в обработчике прерывания вешает всю систему. |
Автор: | phantom-84 [ 18 июн 2012, 19:09 ] |
Заголовок сообщения: | Re: обработка прерываний |
pavia писал(а): Цитата: не каждое прерывание непременно требует отложенной обработки. Ясно что не каждое требует, но каждое ли позволяет?pavia писал(а): Просто идея размаскировать прерывания. Тем самым я смогу предотвратить ситуацию когда баг в обработчике прерывания вешает всю систему. Просто размаскировать прерывания конечно можно, но это криво. Отложенные обработчики не должны прерывать друг друга. А вероятность возникновения ошибки (и подвешивания системы) в первичном обработчике всегда остается, если он плохо написан.
|
Автор: | pavia [ 18 июн 2012, 20:16 ] |
Заголовок сообщения: | Re: обработка прерываний |
Пишу в псевдокоде. Код: 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 он должен проверить его ли это прерывания. В вашей терминологии первичный обработчик он и решает вопрос делать прерывание отложенным. |
Автор: | phantom-84 [ 18 июн 2012, 22:01 ] |
Заголовок сообщения: | Re: обработка прерываний |
Нет. Ты должен проверять, выполняется ли уже отложенная обработка или нет. В приведенном коде много упущений: риск переполнения стека; риск прерывания отложенного обработчика тем же самым обработчиком; риск разрушения ds:[StateInteruptRet] в IrqProc со стороны _Irq1. В очереди можно сохранять непосредственно адреса отложенных обработчиков. Отложенные обработчики предназначены для режима ядра - они не могут выполняться или обращаться к прикладному пространству, т.к. обычно вызываются в контексте произвольного процесса. Как я уже сказал, отложенные обработчики не должны прерывать друг друга - как минимум сами себя, как максимум себя и любые другие отложенные обработчики. Нужно иметь средство защиты от переполнения очереди, например, наложение отложенных обработчиков одного типа в случае переполнения очереди. Отложенная обработка прерываний может быть не самой приоритетной после работы с запрещенными прерываниями, т.е. прежде чем выполнять отложенную обработку прерываний, нужно еще посмотреть на приоритет кода, который работал до возникновения прерывания. Первичные обработчики можно подменять также, как и отложенные обработчики. Просто есть системные первичные обработчики, которые выполняют всю "скрытую" работу, и не системные, которые вызываются из системных. На одно и то же прерывание может быть повешено несколько не системных первичных обработчиков. Еще и поэтому отложенные обработчики лучше идентифицировать по адресу, а не по номеру прерывания. Ну или ввести уникальную нумерацию. |
Автор: | pavia [ 19 июн 2012, 05:31 ] |
Заголовок сообщения: | Re: обработка прерываний |
Цитата: Отложенные обработчики не должны прерывать друг друга. А почему? Цитата: Ты должен проверять, выполняется ли уже отложенная обработка или нет. Поверку опустил, ровно как и приоритеты. Цитата: риск разрушения ds:[StateInteruptRet] в IrqProc со стороны _Irq1 Как ты себе это представляешь? Код ядерный другие приложения не могут его менять. Цитата: Отложенные обработчики предназначены для режима ядра - они не могут выполняться или обращаться к прикладному пространству, т.к. обычно вызываются в контексте произвольного процесса Это понятно. Просто у меня они не в пространстве ядра, а в пространстве драйверов (у него уровень защиты ниже численно больше). Цитата: Еще и поэтому отложенные обработчики лучше идентифицировать по адресу, а не по номеру прерывания. Ну или ввести уникальную нумерацию. Это будет просто код упростил.
|
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |