Прерывания от устройств ввода/вывода и других устройств обрабатываются процедурами прерываний, которые загружаются в виде части адресного пространства ядра. Эти процедуры обрабатывают интерфейс терминала консоли, одни или несколько часов и несколько программно инициируемых прерываний, используемых системой для обработки часов с низким приоритетом и для сетевых возможностей .
В отличие от исключений и системных вызовов прерывания от устройств происходят асинхронно. Процесс, запросивший обслуживание, скорее всего не будет текущим и может даже больше не существовать. Процесс, начавший операцию, будет уведомлен, что операция завершилась, когда он будет вновь запущен. Как и в случае с исключениями и системными вызовами, должно быть сохранено все состояние машины, поскольку любые изменения могли бы вызвать ошибки в текущем выполняющемся процессе.
Обработчики прерываний устройств запускаются лишь по требованию. В отличие от более ранних версий FreeBSD ядро FreeBSD 5.2 создает контекст для каждого драйвера устройства. Таким образом, точно так же как один процесс не может получить доступ к контексту ранее работавшего процесса, обработчики прерываний не могут получить доступ к какому-либо из контекстов ранее выполнявшихся обработчиков прерываний. Стек, обычно использующийся ядром, является частью контекста процесса. Поскольку у каждого устройства есть свой собственный контекст, у него есть также свой стек, с которым он работает.
Прерывания в ранних системах FreeBSD не имели контекста, поэтому они должны были выполняться до своего завершения, не входя в состояние сна. В FreeBSD 5.2 прерывания могут блокироваться в ожидании ресурсов. Однако в блокированном состоянии они не могут вызваться другим событием, поэтому для снижения вероятности потерь прерываний большинство обработчиков по-прежнему работают до своего завершения без ожиданий.
Обработчик прерываний никогда не извлекается из верхней половины ядра. Таким образом, он должен получить всю информацию, которая ему нужна, из структур данных, которые он разделяет с верхней половиной ядра - обычно своей глобальной рабочей очереди. Аналогично вся информация, предоставленная верхней половине ядра обработчиком прерывания, должна передаваться таким же способом.
- 08/07/2010 12:45 - Службы управления памятью
- 04/07/2010 23:01 - Тайм-ауты
- 04/07/2010 21:47 - Статистика и планирование процессов
- 02/07/2010 05:18 - Прерывания от часов
- 26/06/2010 01:52 - Программные прерывания
- 16/06/2010 13:31 - Исключения
- 15/06/2010 08:13 - Состояние процесса
- 15/06/2010 01:16 - Использование ресурсов
- 11/06/2010 15:57 - Возвращение из системного вызова
- 01/06/2010 19:17 - Обработка результатов