pavia писал(а):
Просто идея размаскировать прерывания. Тем самым я смогу предотвратить ситуацию когда баг в обработчике прерывания вешает всю систему.
Если обработчик выполняется в нулевом кольце, то он в любом случае способен завесить всю систему. А вообще, действительно лучше, если "обвязку" вокруг обработчика, в т.ч. и посылку EOI, будет делать код ядра. Т.е. нужно максимально упростить по крайней мере API, сведя обработку прерывания в драйвере до простого вызова функции со стандартным интерфейсом.
phantom-84 писал(а):
Отложенные обработчики предназначены для режима ядра - они не могут выполняться или обращаться к прикладному пространству, т.к. обычно вызываются в контексте произвольного процесса.
Отложенные обработчики можно выполнять в своём собственном контексте.
pavia писал(а):
Цитата:
Отложенные обработчики не должны прерывать друг друга.
А почему?
С целью избежать накладок и синхронизации обращения к данным в обработчике. Два одновременно запущенных обработчика могут разрушить свои данные. В Линуксе есть разные категории отложенной обработки и в частности есть тип обработчиков, которые могут одновременно работать на разных ядрах, но они обязаны тщательно синхронизировать обращение к данным.
Дело в том, что синхронизация на уровне ядра и на уровне пользователя - две разные вещи. Если пользовательская программа обнаружит блокировку, она может передать управление другой программе. В пространстве ядра так не получится. Код ядра вынужден крутиться в цикле, ожидая освобождение блокировки. Именно поэтому в линуксе присутствуют разные типы - один не может исполняться параллельно, в таком случа ядро может просто запланировать обработчик этого прерывания и заняться другой работой, другой может выполняться параллельно, но должен очень тщательно следить за блокировками и не захватывать их надолго.
Да, здесь действительно всё не просто и нужно для начала решить вопрос с архитектурой ядра - микроядро, гибридное или монолитное. В зависимости от этого обработка прерываний выглядит очень по разному. Самый сложный случай - гибридное ядро.